build/clang-plugin/LoadLibraryUsageChecker.cpp
author Cosmin Sabou <csabou@mozilla.com>
Thu, 27 Feb 2020 02:50:40 +0200
changeset 515778 7a5cb26a2d518e9cfaf512ba9a06239b573d7f0e
parent 449515 335e8f4298ce517967691df1468bdbae7f62c287
permissions -rw-r--r--
Backed out 6 changesets (bug 1510030) for causing build bustages. CLOSED TREE Backed out changeset 1bf2a082ca62 (bug 1510030) Backed out changeset 8b0fd12a063b (bug 1510030) Backed out changeset ec9c6b79ea42 (bug 1510030) Backed out changeset cd729f8b0220 (bug 1510030) Backed out changeset c3e6c17ba7b0 (bug 1510030) Backed out changeset edc3c212be1f (bug 1510030)

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "LoadLibraryUsageChecker.h"
#include "CustomMatchers.h"

// On MacOS the filesystem is UTF-8, on linux the canonical filename is 8-bit
// string. On Windows data loss conversion will occur. This checker restricts
// the use of ASCII file functions for loading libraries.

void LoadLibraryUsageChecker::registerMatchers(MatchFinder *AstMatcher) {
  AstMatcher->addMatcher(
      callExpr(
          allOf(isFirstParty(),
                callee(functionDecl(anyOf(
                    allOf(isInSystemHeader(), anyOf(hasName("LoadLibraryA"),
                                                    hasName("LoadLibraryExA"))),
                    hasName("PR_LoadLibrary")))),
                unless(hasArgument(0, stringLiteral()))))
          .bind("funcCall"),
      this);
}

void LoadLibraryUsageChecker::check(const MatchFinder::MatchResult &Result) {
  const CallExpr *FuncCall = Result.Nodes.getNodeAs<CallExpr>("funcCall");

  if (FuncCall) {
    diag(FuncCall->getBeginLoc(),
         "Usage of ASCII file functions (such as %0) is forbidden.",
         DiagnosticIDs::Error)
        << FuncCall->getDirectCallee()->getName();
  }
}