我如何才能找到C 代码以找到所有未使用的返回值
How can I lint C++ code to find all unused return values?
我想静态地检查未使用返回值的非void函数的所有调用。
实际上,这就像将__attribute__ ((warn_unused_result))
应用于所有非流动功能,但对于一个不切实际的大型项目,当然也是如此。
是否有任何静态分析工具可以提供此信息?
这可以使用clang-query
完成。这是一个shell脚本,它调用 clang-query
查找返回未使用的值的调用:
#!/bin/sh
# cmd.sh: Run clang-query to report unused return values.
# When --dump, print the AST of matching syntax.
if [ "x$1" = "x--dump" ]; then
dump="set output dump"
shift
fi
query='m
callExpr(
isExpansionInMainFile(),
hasParent(anyOf(
compoundStmt(),
ifStmt(hasCondition(expr().bind("cond"))),
whileStmt(hasCondition(expr().bind("cond"))),
doStmt(hasCondition(expr().bind("cond")))
)),
unless(hasType(voidType())),
unless(isTypeDependent()),
unless(cxxOperatorCallExpr()),
unless(callee(namedDecl(anyOf(
hasName("memset"),
hasName("setlength"),
hasName("flags"),
hasName("width"),
hasName("__builtin_memcpy")
)))),
unless(equalsBoundNode("cond")))'
clang-query -c="$dump" -c="$query" "$@"
在test1.cc
上运行此操作:
$ ./cmd.sh test1.cc --
查询的基本思想是寻找直接父母是复合语句的呼叫表达式。扩展以处理一个直接父母,该父母是控制流量语句,请注意何时以条件表达式出现呼叫。
查询处理的其他一些并发症:
这仅在翻译单元的主文件中报告,以消除标头的大量噪声。卸下
isExpansionInMainFile
过滤器从消防软管中饮用。在C 模板中,我们可能不知道该类型是什么,因此请抑制与依赖类型的所有调用。
memset
(例如CC_6(的某些功能无用或仅有很少有用的返回值。必须将它们过滤掉以查看任何有用的信号。查询中的功能名称列表只是冰山的提示。c 超载运算符,包括
operator<<
和operator=
,通常返回一个值,但该值通常被忽略。因此,抑制了所有超载运营商的报告。
我已经在我的公用事业库中的某些文件上轻轻地测试了此文件(来自Clang llvm-8.0.1(有用。根据您的应用程序,可能还有更多需要过滤的东西。
查询语言在https://clang.llvm.org/docs/libastmatchersreference.html上进行了描述。有关clang-query
的更多链接和信息,请参见我的答案。
cppcheck是一种命令行工具,试图检测您的C/C 编译器看不到的错误,它还包括基于Web的报告生成器。
我认为有软件可以像DevExtreme
一样,在social.msdn.microsoft.com
中,在此问题的答案中,how-to-get-a-warning-for-an-unused-return-value?
他们提到了Visual Studio的Premium和Ultimate版本具有一些工具。
阅读以下内容:https://social.msdn.microsoft.com/forums/vstudio/en-us/4355715a-5af7-4a2b-8aaa2b-8aa0-bc2112112aea911/未使用的返回价值?论坛= vclanguage
和此 mandatory-error-codes-revisited
来自:http://www.drdobbs.com/cpp/mandatory-error-codes-revisited/191601612
- 如何在另一个函数中使用返回值作为参数?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 指针未正确返回值
- 我如何才能找到C 代码以找到所有未使用的返回值
- 可视化C++调试器未显示返回值
- 程序未完成返回值3221225477没有编译器错误
- 是使用按引用传递来填充容器更好,还是使用返回值来填充容器更好
- 运算符++:引用与值返回和未使用的参数
- 在课堂中使用返回值
- 将未使用的值初始化为0 c++数组
- 如果 GCC 4.4.7 上未使用返回值,则强制调用类运算符 == 失败
- 使用返回值传递到构造函数不起作用
- 从断言中删除未使用的值警告
- int类型的函数未使用返回C++
- 未使用的函数返回值会发生什么
- c++编译器会通过“引用”优化掉未使用的返回值吗
- 如何在GMOCK中使用未指定的参数创建返回值
- 使用返回值优化get和函数调用周围的循环