cppcheck:缓冲区的访问超出范围

时间:2020-01-27 22:27:55

标签: c cppcheck

我有下面的代码。运行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是否正确报告此错误?

1 个答案:

答案 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版没有报告。