我有下面的代码。运行cppcheck工具后,由于缓冲区访问超出范围,它会报告错误。在snprintf上报告了一个错误。
public class GetTodoRepository {
public Single<String> fetchTodo() {
return retrofit.create(TodoApi.class)
.getTodo()
.doOnSuccess(s -> cacheManager.saveTodo(s))
.onErrorReturn(throwable -> cacheManager.getTodo())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
在命令行交互下面:
#include <stdio.h>
int main(int argc, char * argv[])
{
if (argc > 1) {
char testref[8] = "";
snprintf(testref, sizeof(testref), "Ref:%s", argv[1]);
printf("===>testref=%s\n", testref);
}
}
cppcheck是否正确报告此错误?
答案 0 :(得分:2)
我认为,一般而言,cppcheck报告此错误是正确的。 snprintf
函数的行为与实现有关,在某些实现中,如果字符串对于缓冲区太大,则不能保证写入空字符。在这种情况下,对printf()
的连续调用将在缓冲区边界之外读取。
我至少可以找到snprintf
实现中的one example,这将导致代码出界错误。根据{{3}},在c99之前的True64 / DigitalUnix也是如此。
看看cppcheck是否也为以下代码报告错误(它不应报告错误)会很有趣:
#include <stdio.h>
int main(int argc, char * argv[])
{
if (argc > 1) {
char testref[8] = "";
int ret = snprintf(testref, sizeof(testref), "Ref:%s", argv[1]);
if (ret >= 0) {
printf("===>testref=%s\n", testref);
}
}
}
还要注意,Cppcheck版本1.82不会报告您的代码错误。我不确定为什么1.72版会报告错误而1.82版没有报告。