我正在用C/C++编写的一组库上运行完美查找程序。我有很多由完美查找者生成的警告。我的问题是,我在多大程度上可以依赖这些生成的警告?例如,考虑numpy库(https://github.com/numpy/numpy/blob/4ada0641ed1a50a2473f8061f4808b4b0d68eff5/numpy/f2py/src/fortranobject.c)中的以下函数:
static PyObject *
fortran_doc(FortranDataDef def)
{
char *buf, *p;
PyObject *s = NULL;
Py_ssize_t n, origsize, size = 100;
if (def.doc != NULL) {
size += strlen(def.doc);
}
origsize = size;
buf = p = (char *)PyMem_Malloc(size);
if (buf == NULL) {
return PyErr_NoMemory();
}
if (def.rank == -1) {
if (def.doc) {
n = strlen(def.doc);
if (n > size) {
goto fail;
}
memcpy(p, def.doc, n);
p += n;
size -= n;
}
else {
n = PyOS_snprintf(p, size, "%s - no docs available", def.name);
if (n < 0 || n >= size) {
goto fail;
}
p += n;
size -= n;
}
}
else {
PyArray_Descr *d = PyArray_DescrFromType(def.type);
n = PyOS_snprintf(p, size, "'%c'-", d->type);
Py_DECREF(d);
if (n < 0 || n >= size) {
goto fail;
}
p += n;
size -= n;
if (def.data == NULL) {
n = format_def(p, size, def) == -1;
if (n < 0) {
goto fail;
}
p += n;
size -= n;
}
else if (def.rank > 0) {
n = format_def(p, size, def);
if (n < 0) {
goto fail;
}
p += n;
size -= n;
}
else {
n = strlen("scalar");
if (size < n) {
goto fail;
}
memcpy(p, "scalar", n);
p += n;
size -= n;
}
}
if (size <= 1) {
goto fail;
}
*p++ = '\n';
size--;
/* p now points one beyond the last character of the string in buf */
#if PY_VERSION_HEX >= 0x03000000
s = PyUnicode_FromStringAndSize(buf, p - buf);
#else
s = PyString_FromStringAndSize(buf, p - buf);
#endif
PyMem_Free(buf);
return s;
fail:
fprintf(stderr, "fortranobject.c: fortran_doc: len(p)=%zd>%zd=size:"
" too long docstring required, increase size\n",
p - buf, origsize);
PyMem_Free(buf);
return NULL;
}这里有两个memcpy() API调用,完美查找器告诉我:
['vul_fortranobject.c:216: [2] (buffer) memcpy:\\n Does not check for buffer overflows when copying to destination (CWE-120).\\n Make sure destination can always hold the source data.\\n memcpy(p, "scalar", n);']我不知道这份报告是否属实。
发布于 2022-07-24 00:08:53
要回答您的问题:静态分析工具(如FlawFinder)可以生成许多“假阳性”。
我在谷歌上搜索了一些可量化的信息,并找到了一篇关于“DeFP”的有趣文章:
静态分析工具经常用于检测软件系统中的潜在漏洞。然而,这些工具的一个不可避免的问题是其大量的警告和高的假阳性率,这需要花费时间和精力进行调查。本文提出了一种新的静态分析警告排序方法-- DeFP。
基于具有相似上下文的警告往往具有相似的标签(真正或假阳性)的直觉,DeFP构建了两个BiLSTM模型来捕获与标记警告的上下文相关的模式。在此之后,对于一组新的警告,DeFP可以根据它们成为真正的积极因素(即实际漏洞)的可能性对它们进行计算和排序。
我们在10个现实世界项目的数据集上的实验结果表明,使用DeFP,只要对60%的警告进行调查,开发人员就可以发现+90%的实际漏洞。此外,DeFP提高了最先进的方法,无论是精确性还是召回率都达到了30% .
显然,作者建立了一个神经网络来分析FlawFinder结果,并对其进行排序。
我怀疑DeFP对你来说是一个实用的“解决方案”。但是是的:如果你认为特定的"memcpy()“警告是”假阳性“,那么我倾向于同意。很有可能是:)
https://stackoverflow.com/questions/73094915
复制相似问题