<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/58012>58012</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            我在测试自己编写的插件时显示让我写issues报告bug
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          wz-fu
      </td>
    </tr>
</table>

<pre>
    bug信息:

> ![image-20220927155543203](https://raw.githubusercontent.com/wz-fu/My-img/master/img/image-20220927155543203.png)
>
> ![image-20220927155703589](https://raw.githubusercontent.com/wz-fu/My-img/master/img/image-20220927155703589.png)
>
> ![image-20220927155812768](https://raw.githubusercontent.com/wz-fu/My-img/master/img/image-20220927155812768.png)

clang版本:16.0.0

命令:

> ./bin/clang -cc1 -load ./lib/FunPramCheckerPlugin.so -analyze -analyzer-checker=plugin.FunPramChecker ~/ShiXi/Example_Test.c -I /usr/include/ -I ~/llvm-project/build/lib/clang/16.0.0/include/

测试文件:

~~~c
#include "stdio.h"

typedef int (*main_t)(int, char **);
int main(int argc, char **argv)
{
  main_t foo = main;
  int exit_code = foo(argc, argv); // actually calls main()!
  return exit_code;
}
~~~

插件文件:

~~~c++
#include <iostream>
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
#include "clang/Basic/LLVM.h"
#include "llvm/Object/ObjectFile.h"

using namespace clang;
using namespace ento;
using namespace std;

namespace
{
    class FunPramChecker : public Checker<check::PreCall>
    {
    public:
        mutable std::unique_ptr<BuiltinBug> BT;

    public:
        void checkPreCall(const CallEvent &Call, CheckerContext &Ctx) const;
    };
} // anonymous namespace

void FunPramChecker::checkPreCall(const CallEvent &Call, CheckerContext &Ctx) const
{
    unsigned PramNum = Call.getNumArgs();
    const FunctionDecl *Pramarg = Call.getArgSVal(0).getAsFunctionDecl();
    string name = Pramarg->getNameInfo().getAsString();
    cout << name << endl;
}
// Register plugin!
extern "C" void clang_registerCheckers(CheckerRegistry &registry)
{
    registry.addChecker<FunPramChecker>(
        "plugin.FunPramChecker", "The parameter of the function is illegal",
        "");
}

extern "C" const char clang_analyzerAPIVersionString[] =
    CLANG_ANALYZER_API_VERSION_STRING;
~~~

CMakeLists.txt

~~~cmake
set(LLVM_LINK_COMPONENTS
  Support
  )

set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/FunPramCheckerPlugin.exports)
add_llvm_library(FunPramCheckerPlugin MODULE BUILDTREE_ONLY FunPramChecker.cpp PLUGIN_TOOL clang)

clang_target_link_libraries(FunPramCheckerPlugin PRIVATE
  clangAnalysis
  clangAST
  clangStaticAnalyzerCore
  clangStaticAnalyzerFrontend
  )
~~~

FunPramCheckerPlugin.exports:

~~~
clang_registerCheckers
clang_analyzerAPIVersionString
~~~
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1V92TojgQ_2viS0oLQRQefADELWsdtdSZ2rkXKkJGc4vgQZid2b_-usOH4uhuzdXtFIMhSXf_0t_ZpdH7eFfsiT8g7pQ4feIPidUnzpT4U-J6xHaINiFa_TZ8SvQ-MV1xZHve1TVd12x91DdNc2DomkHMCdGtg5SnnBgO0afwZOxHby_kodgVOc_CNJE8kb0wPcLaj5_dlwJ-H9674riHwZHlkmcwKD_viOmdEli1G1C_RTfSDNOy_zi6Usyn0Vl9fTS0_ji6UkwbnXqHMYM5f0RARZaFLmB7xPEaF-gPe1pPazmCbxK7T9yJchyXOIO7_tIDKDuRwFuJod0w7NNunLJILcViB-9pkawydvQOPPzOs1Vc7EXSy1PaZQmL33_yZpB1w3IPMSanclublpKRDww3B_FNwK__xo6nmAdbnoPeaHcGNpgWudJSEsZFxGGkphVZHL8eu6cs_ZuHEnEXIo4akKWa9GmljksObd0MiWsSyyW-hYFkm0qjEFejSlvu8La2AIJ6wupbNyoJAFrPZSTS3gFGlzTy_cQj_kJFImGTRXTnyEQSSLSwbsEs0T0aHhjoRXfUYxPDLWmRBneXGynL9uHVbph6PfvKqKKjtJRBX9KUgh1KJkazisz4m5BBmCJ02AAbQUgtoOZquLT0cspCWbA4fqchvPMalDpDv-aacVlkyZlxI5CMJlf6u7aGBUbQL3T_WWvoLj4fbGJ4Is1lxtnxHOQtk9UOs5FMitCpPBgmvDRDr3GL_Zqf0qyMWvjagjUvTfwpblUAfJ5-mqm8Ep15rPlewMne_zOWFZOHDU9yIcWrwgZ29V8xd_2Oo8tyARqfzudPD3c3Y5jCnuWuitNyMBUx_xAgRS4g6STsyPMTCzkt5dS-c70KCNO7ixCBZ6dT72btQ4RQFJTn9Do5GQ49FbtYhNSr85inMhqmfMNZZRxV1fgTMmpxLYlxczOFf8dCsl1cQURGRSL-KXhwkijAhTQmRQIOhgnZ3V6d4hd8X1MRUYWvRqZbUIVySRuLgj2G5YpXn8lDf3orV-QbhDFVNBcpAk81uYzgJhMkafJ-TIucXutWvRWetk7L8_5vGD8asgA33ic8oih0URxVRkNuvT2X8O1k-7zKVpcHLCEA1lCKNJnwMMakijwg_7V4AIPNE0PYUFRsNZNf0t1gDsFZ-6ZiVbHtgn0RFEzPkpe0JCwZbhTFTZyFxFwGT81PjSEhxDdybGmmMkGAQ5c1uEnToFEOSRpi0IP_yn0w4oKsoqjUjxq7SjZoiqwa3yo6WAKqtMSi6Bw-1-7g4yFbXgxQbvYKmCrAI-Bne-D0xGCF46HSFyph4qWyARU5FXHM92gjpPjAXT32DW3dUkrpGKrKlqqpWxtnNXsCzYDEylimCz0h2vcs0Js7iy-Bs3Dmz3_56wBIgid_vZktF8Fmu54tvlyAuFENvQf2nc9BiXlPvsnLlXO5O8KWci7nkFwtzMTBfLb4GnjLh9Vy4S-2mxrQpjhh_ao_r_rKC3r_22q53vqTYPP84C7nwXQ2x3Z4APb1HpyvfuA9rtfAOdgsH9eeH0xma9Tinc6Qv6HUvBEH_hBgTQigUcsYuo91i44-LCePINd9nM0n27XvB8vF_Pkqn_TC04mu5o9fZotgu1zOq4pxo2MOJIQclyA0-V5JFjy_J3u1nj052yavKw6qcOYib09utq3vdo1VBfb-clPLP1jkljv8UrnG7XboUgEfgvpi7a5Xt9l1-Lg_HA70oTm0rU40NiLbsFlHChnzsWreLLxp4H0D7iTWrebawl7OUXcSd0TcPt5ksJ0b4owFzZ6NM9DdWYM73eCoHljE9XEz3GdcR4nwiWO3YCiGIs8LMDXOO8Qxq-uQ5cBVulNk8bh9iytvcNW1repdrm4aFUN9alpaX-8cxsORbfUH0c5i4SAyw8jcRZZt9PtDw9B4qEWdmO14nI8xSeh6wn9QxQIzkTnpiHF979OAn2H1tNFO03cD095Fo0E0YGSgcWiz4x7i6KXZvpONFSQ4QQ6LscoRzSK0MlgD-bjMSR1WyEOajdUVtKMEjxXwfwFlN8Aq">