fccf是一个命令行工具,可以根据搜索字符串快速搜索目录中的C/C++源代码,并打印与查询匹配的相关代码片段。
以下视频展示了fccf在torvalds/linux中搜索并找到代码片段。
https://user-images.githubusercontent.com/8450091/165400381-9ba49a62-97fb-4f4a-890a-0dc9b20dfe75.mp4
fccf源代码树(现代C++)以下视频展示了fccf搜索fccf C++源代码。
注意,这里的搜索结果包括:
https://user-images.githubusercontent.com/8450091/165402206-65d9ed43-b9dd-4528-92bd-0b4ce76b6468.mp4
--flag提供一个空查询以匹配任何--flag,例如任何枚举声明。
...或任何类构造函数
<img width="694" alt="image" src="https://yellow-cdn.veclightyear.com/0a4dffa0/4c0ef7b9-310d-4593-9db6-45b4ae05d345.png">for语句使用--for-statement来搜索for语句。fccf将尝试找到包含查询字符串的for语句(包括C++范围for)。
使用--include-expressions选项来查找与查询匹配的表达式。
以下示例展示了fccf查找对isdigit()的调用。
以下示例展示了fccf查找对clang_options变量的引用。
using声明使用--using-declaration选项来查找using声明、using指令和类型别名声明。
namespace别名使用--namespace-alias选项来查找namespace别名。
throw表达式使用--throw-expression和查询字符串来搜索包含该查询字符串的特定throw表达式。
如前所述,这里的空查询将尝试匹配代码库中的任何throw表达式:
使用CMake构建fccf。更多详情,请参见BUILDING.md。
注意:fccf需要安装libclang和LLVM。
# 安装libclang和LLVM # sudo apt install libclang-dev llvm git clone https://github.com/p-ranav/fccf cd fccf # 构建 cmake -S . -B build -D CMAKE_BUILD_TYPE=Release cmake --build build # 安装 sudo cmake --install build
fccf使用方法foo@bar:~$ fccf --help 用法: fccf [--help] [--version] [--help] [--exact-match] [--json] [--filter VAR] [-j VAR] [--enum] [--struct] [--union] [--member-function] [--function] [--function-template] [-F] [--class] [--class-template] [--class-constructor] [--class-destructor] [-C] [--for-statement] [--namespace-alias] [--parameter-declaration] [--typedef] [--using-declaration] [--variable-declaration] [--verbose] [--include-expressions] [--static-cast] [--dynamic-cast] [--reinterpret-cast] [--const-cast] [-c] [--throw-expression] [--ignore-single-line-results] [--include-dir VAR]... [--language VAR] [--std VAR] [--no-color] query [path]... 位置参数: query path [参数数量: 0或更多]
可选参数:
-h, --help 显示帮助信息并退出
-v, --version 打印版本信息并退出
-h, --help 显示帮助信息并退出
-E, --exact-match 仅考虑精确匹配
--json 以JSON格式打印结果
-f, --filter 仅评估匹配过滤器模式的文件 [参数数量=0..1] [默认值: "."]
-j 线程数 [参数数量=0..1] [默认值: 5]
--enum 搜索枚举声明
--struct 搜索结构体声明
--union 搜索联合体声明
--member-function 搜索类成员函数声明
--function 搜索函数声明
--function-template 搜索函数模板声明
-F 搜索任何函数、函数模板或类成员函数
--class 搜索类声明
--class-template 搜索类模板声明
--class-constructor 搜索类构造函数声明
--class-destructor 搜索类析构函数声明
-C 搜索任何类、类模板或结构体
--for-statement 搜索for语句
--namespace-alias 搜索命名空间别名
--parameter-declaration 搜索函数或方法参数
--typedef 搜索typedef声明
--using-declaration 搜索using声明、using指令和类型别名声明
--variable-declaration 搜索变量声明
--verbose 请求详细输出
--ie, --include-expressions 搜索引用某些值或成员的表达式,如函数、变量或枚举器
--static-cast 搜索static_cast
--dynamic-cast 搜索dynamic_cast
--reinterpret-cast 搜索reinterpret_cast
--const-cast 搜索const_cast
-c 搜索任何static_cast、dynamic_cast、reinterpret_cast或const_cast表达式
--throw-expression 搜索throw表达式
--isl, --ignore-single-line-results 忽略前向声明、成员函数声明等
-I, --include-dir 附加包含目录 [参数数量=0..1] [默认值: {}] [可重复]
-l, --language clang使用的语言选项 [参数数量=0..1] [默认值: "c++"]
--std clang使用的C++标准 [参数数量=0..1] [默认值: "c++17"]
--nc, --no-color 停止fccf对输出进行着色
工作原理:
fccf对目录进行递归搜索,在一堆文件中查找目标 - 类似于grep或ripgrep - 它尽可能使用SSE2 strstr SIMD算法(修改的Rabin-Karp SIMD搜索;参见这里)在多个线程中快速找到包含目标的源文件子集。libclang解析翻译单元(构建抽象语法树)。CXCursor_FunctionDecl。libclang对节点的命名)与搜索查询匹配,则确定AST节点的源范围 - 源范围是缓冲区中代码片段的起始和结束索引。关于include_directories的说明:
为了使所有这些工作正常进行,fccf首先识别包含头文件的候选目录,例如以include/结尾的路径。然后将这些路径作为-Ifoo -Ibar/baz等添加到clang选项中(在解析翻译单元之前)。此外,对于每个翻译单元,父路径和祖父路径也会被添加到该单元的包含目录中,以增加成功解析的可能性。
还可以使用-I或--include-dir选项为fccf提供额外的包含目录。使用详细输出(--verbose)可以识别libclang解析中的错误,并尝试进行修复(例如,添加正确的包含目录以使libclang满意)。
要在没有任何libclang错误的情况下在fccf源代码上运行fccf,我必须明确提供来自LLVM-12的包含路径,如下所示:
foo@bar:~$ fccf --verbose 'lexer' . --include-dir /usr/lib/llvm-12/include/ 检查 ./source/lexer.cpp 检查 ./source/lexer.hpp 检查 ./source/searcher.cpp // ./source/lexer.hpp(第14行至第40行) class lexer { std::string_view m_input; fmt::memory_buffer* m_out; std::size_t m_index {0}; bool m_is_stdout {true}; char previous() const; char current() const; char next() const; void move_forward(std::size_t n = 1); bool is_line_comment(); bool is_block_comment(); bool is_start_of_identifier(); bool is_start_of_string(); bool is_start_of_number(); void process_line_comment(); void process_block_comment(); bool process_identifier(bool maybe_class_or_struct = false); void process_string(); std::size_t get_number_of_characters(std::string_view str); public: void tokenize_and_pretty_print(std::string_view source, fmt::memory_buffer* out, bool is_stdout = true); }
参考文献:


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。


AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。


一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作


AI办公助手,复杂任务高效处理
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作, 覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号