This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在 CCS 工程[10.4.0.00006]中使用 SYS/BIOS [6.83.0.0.18]和 XDCtools [3.62.0.08]。
我们使用 Cppcheck [2.9]进行静态分析,并不断收到错误 src 信息->[..\Va_start\source\Debug\configPkg\package\cg\cpapp_p28L.c:2018](错误) va_list 'va'在 va_start ()被调用前使用。 [va_list_usedBeforeStarted]
函数"xdc_Int xdc_runtime_System_printfExtend__i (xdc_Char System_Parse * pbuf、xdc_CString * PFMT、XDC_VaList * PVA、xdc_runtime_parse *解析)"中的多行中存在此错误
由于这个文件是生成的、我无法找到解决这个问题的方法。 有人可以协助吗?
谢谢!
米兰
如果您可以找到用于生成此代码的模板文件、是否可以尝试进行编辑? 它看起来像这个位于 \packages\XDC\runtimes\System.xdt。
惠特尼
感谢您的建议。 我可以在技术上更改该文件、但这是非常不可取的解决方案。 我基本上是要更改 XDC 工具附带的文件、并且在他自己的安装中的每个更新时都需要对这个文件进行更改(由负责我项目的任何人进行更改)。
此外、我还不太清楚如何正确地修改它。 "va_start"在该文件中的任何位置都没有被调用、我无法找到它的实际调用位置、以及将哪些参数传递给该函数。 据我所见、此文件被分配给了"XDC_RUNTIME_System_extendFxn_C"、但我在工程中没有获得任何其他引用。
我曾经使用过 Swi 示例、因为我知道这个示例名为 System_printf、之后我发现对 va_start 的调用出现在生成的.c 文件中。
我有点惊讶、您在您生成的文件中没有看到它。 你是否在项目中进行 System_printf (或相似函数)调用?
惠特尼
我在工程中未使用"System_printf"。 我发现它在一些未使用的库中、但我的问题仍然存在、即使在删除它之后也是如此。
"app_p28L.c"文件中有一些对"va_start"的调用、但我无法找到它们与"xdc_runtime_System_printfExtend__i"之间的连接来证明"va_start"确实被调用。
/* * ======== System_printfExtend__I ======== * This function processes optional extended formats of printf. * * It returns the number of characters added to the result. * * Precision (maximum string length) is not supported for %$S. * * Right-justified (which is default) minimum width is not supported * for %$L, %$S, or %$F. */ /* REQ_TAG(SYSBIOS-1072) */ xdc_Int xdc_runtime_System_printfExtend__I(xdc_Char **pbuf, xdc_CString *pfmt, xdc_VaList *pva, xdc_runtime_System_ParseData *parse)
/* * ======== xdc.runtime.System FUNCTION STUBS ======== */ /* printf_va__E */ xdc_Int xdc_runtime_System_printf_va__E( xdc_CString fmt, va_list arg__va) { return xdc_runtime_System_printf_va__F(fmt, arg__va); } /* printf__E */ xdc_Int xdc_runtime_System_printf__E( xdc_CString fmt, ...) { xdc_Int retval; va_list arg__va; (void)va_start(arg__va, fmt); retval = xdc_runtime_System_printf_va__F(fmt, arg__va); va_end(arg__va); return retval; } /* aprintf_va__E */ xdc_Int xdc_runtime_System_aprintf_va__E( xdc_CString fmt, va_list arg__va) { return xdc_runtime_System_aprintf_va__F(fmt, arg__va); } /* aprintf__E */ xdc_Int xdc_runtime_System_aprintf__E( xdc_CString fmt, ...) { xdc_Int retval; va_list arg__va; (void)va_start(arg__va, fmt); retval = xdc_runtime_System_aprintf_va__F(fmt, arg__va); va_end(arg__va); return retval; } /* sprintf_va__E */ xdc_Int xdc_runtime_System_sprintf_va__E( xdc_Char buf[], xdc_CString fmt, va_list arg__va) { return xdc_runtime_System_sprintf_va__F(buf, fmt, arg__va); } /* sprintf__E */ xdc_Int xdc_runtime_System_sprintf__E( xdc_Char buf[], xdc_CString fmt, ...) { xdc_Int retval; va_list arg__va; (void)va_start(arg__va, fmt); retval = xdc_runtime_System_sprintf_va__F(buf, fmt, arg__va); va_end(arg__va); return retval; } /* asprintf_va__E */ xdc_Int xdc_runtime_System_asprintf_va__E( xdc_Char buf[], xdc_CString fmt, va_list arg__va) { return xdc_runtime_System_asprintf_va__F(buf, fmt, arg__va); } /* asprintf__E */ xdc_Int xdc_runtime_System_asprintf__E( xdc_Char buf[], xdc_CString fmt, ...) { xdc_Int retval; va_list arg__va; (void)va_start(arg__va, fmt); retval = xdc_runtime_System_asprintf_va__F(buf, fmt, arg__va); va_end(arg__va); return retval; } /* snprintf_va__E */ xdc_Int xdc_runtime_System_snprintf_va__E( xdc_Char buf[], xdc_SizeT n, xdc_CString fmt, va_list arg__va) { return xdc_runtime_System_snprintf_va__F(buf, n, fmt, arg__va); } /* snprintf__E */ xdc_Int xdc_runtime_System_snprintf__E( xdc_Char buf[], xdc_SizeT n, xdc_CString fmt, ...) { xdc_Int retval; va_list arg__va; (void)va_start(arg__va, fmt); retval = xdc_runtime_System_snprintf_va__F(buf, n, fmt, arg__va); va_end(arg__va); return retval; }
这些函数是否显示在您的.map 文件中? 您是否能够使用 CCS 调试程序将断点放置在这些函数中、以查看它们是否被调用? 据我所知、它们仅与打印呼叫相关。 System 模块用于 abort 函数以及 printf、因此即使您仅使用 abort/exit 功能、它也可能会生成系统模块的所有函数。
惠特尼
我的.map 文件中没有单独提到"print"(有趣的是、启用了十六进制实用程序的.map 文件会通过其输出重新写入)。 我也无法放置断点。 我收到此消息:
看起来我将发音这是未使用的生成代码、并希望 我们的安全团队可以轻松处理。
非常感谢您的帮助。 我从未深入探讨过我们项目的背景基础。