如何将Java方法标记为“必须使用结果”以进行静态分析?

9
使用GCC编译C或C++时,您可以使用属性((warn_unused_result))标记函数,这将导致编译器抱怨如果调用返回值并且未将其分配给任何内容的函数。
我开发了一个Java库,其中包含像这样的方法 - 调用它们然后丢弃结果总是一个错误。我希望API用户能够通过静态分析(例如使用FindBugs或IntelliJ检查)识别此类错误。
我想知道是否有一种常用的方法注释来标记方法或函数为“必须使用结果”。FindBugs有一些针对标准库的特殊情况缺陷查找器,但通用方式将非常有用。

4
默认情况下,IntelliJ IDEA 会在返回结果被忽略时显示一个警告。 - Boris Pavlović
我不认为会发生这种情况。是否需要启用特定的检查来实现这一点? - Mike Hearn
1
在此处:http://www.jetbrains.com/idea/documentation/inspections/IgnoreResultOfCall.html - Boris Pavlović
我明白了,谢谢。我想我可以将这样的列表与我的项目一起发布,但基于注解的方法会更清晰。也许我会向JetBrains提交一个功能请求。 - Mike Hearn
3个回答

8

这个有一个标准的注解,叫做@CheckReturnValue。FindBugs 已经使用了它,例如在这里

Guava 内部也使用它,例如在Splitter配置方法中,来自于JSR 305


ErrorProne现在也有这样的检查:http://errorprone.info/bugpattern/CheckReturnValue - dimo414
有没有办法让IntelliJ IDEA自动将此添加到任何新创建的带返回值函数中? - Neil

3

使用

import javax.annotation.CheckReturnValue;
.
.
.
@CheckReturnValue

一些良好的@CheckReturnValue示例可在Google error-prone项目wiki上找到。(如果你喜欢像FindBugs这样的静态分析工具,你一定要看看error-prone;它对源代码/AST进行分析而不是字节码,这使它成为与FindBugs等工具互补的选择。)

0
如果您是在2019年或之后阅读此内容:请使用@edu.umd.cs.findbugs.annotations.CheckReturnValue进行方法注释,该注释可从com.github.spotbugs:spotbugs-annotations获取。SpotBugs是FindBugs的一个积极维护的后继者。

1
你关于SpotBugs的说法是正确的,但你可能指的是“edu.umd.cs.findbugs.annotations.CheckReturnValue”。 - Christophe Roussy
1
感谢您的提醒,Christophe。我已经更新了帖子并更正了软件包名称。 - raindev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接