谁销售 MISRA 链接器?它似乎有一个疯狂的错误。
您可以通过int (*foo)(int) = tolower;
在文件范围内获取地址来解决它吗?
编辑:我的理由是:
a。这是我这十年见过的最愚蠢的事情,所以它可能是一个错误,但是
b。将其推向边缘情况(通过全局导出其名称的符号)可能会关闭它。
为了这是正确的行为,即不是一个错误,它必须是一个 MISRA 错误,以包含任何库函数一次,如 initialise_system_timer、initialise_watchdog_timer、...,这让我很头疼。
编辑:另一个想法。再次基于这是一个极端情况错误的假设。
理论:也许编译器正在做内联和生成函数的实现。然后该函数(当然)没有被调用。所以链接器规则看到了那个未调用的函数。
GNU 有防止内联的选项。你能对 tolow 的使用做同样的事情吗?这会改变错误吗?你可以做一个测试
#define inline /* nothing */
在包含 ctype.h 之前,然后取消定义宏。
另一个测试是定义:
#define inline static inline
在包括 ctype.h 之前,这是我期望的内联版本。
EDIT2:我认为应该报告一个错误。我想 IAR 有一个解决方法。我会接受他们的建议。
睡了一夜之后,我强烈怀疑问题inline int tolower()
不是static inline int tolower
or int tolower
,因为它最有意义。拥有一个未被调用的公共函数似乎是程序中错误的症状。
即使有文档,所有的编码方法都有缺点。
我强烈支持 OP,我不会更改标准头文件。我认为有几个原因。例如,工具链(带有一组新的标头)的未来升级会破坏旧应用程序,如果它得到维护。或者只是在不同的机器上构建应用程序会产生错误,合并两个明显正确的应用程序可能会产生错误,...。不会有什么好的结果。-100
用于#define ...
使错误消失。我不喜欢使用宏来更改标准库。这似乎是一个长期坏主意的种子。如果将来程序的另一部分使用具有类似问题的另一个函数,则“修复”的应用会变得更糟。一些没有经验的开发人员可能会得到维护代码的工作,并且“学习”包装奇怪的#define
诡计#include
是“正常”的做法。将奇怪的宏变通方法包装起来成为公司的“惯例” #include <ctype.h>
,这种变通方法在修复后仍然存在多年。-20
使用命令行编译器选项关闭内联。如果这可行,并且语义是正确的,即在两个源文件中包含头文件和使用函数不会导致多个定义的函数,那么可以。我预计它会导致错误,但值得在错误报告中确认。它为将来出现的其他人设置了一个令人沮丧的陷阱。如果不同inline
使用了标准库函数,由于某种原因,人们必须查看生成的代码,它也不会被包含在内。他们可能会有点疯狂地想知道为什么不尊重 inline。我猜想他们查看生成代码的原因是因为性能至关重要。根据我的经验,人们会花大量时间查看代码,在查看有效程序的构建脚本之前会感到困惑。如果将抑制内联用作修复程序,我确实觉得在任何地方都比在一个文件中执行要好。至少语义是一致的,并且可能会注意到高级注释或文档。任何使用构建脚本作为“快速检查”的人都会得到一致的行为,这可能会导致他们查看文档。-1(到处都没有内联)-3(一个文件上没有内联)
在第二个源文件中以虚假的方式使用 tolower。这样做的好处是构建系统不会被额外的编译器选项“感染”。它也是一个小文件,可以解释正在解决的错误。我不太喜欢这个,但比起摆弄标准标题,我更喜欢它。我目前担心的是它可能不起作用。它可能包括链接器无法解析的两个副本。我确实喜欢它比奇怪的“获取地址并查看链接器是否关闭”更好(我认为这是测试边缘情况的一种有趣方式)。-2
编写自己的代码。我不了解应用程序的更广泛背景。我的反应不是替换库函数的代码,因为我关心测试(以及引入更多代码的单元测试)和长期维护。我对字符 I/O 更加紧张,因为应用程序可能需要能够处理更广泛的字符集,例如 UTF-8 编码,而用户定义的 tolower 往往会不同步。这听起来确实像一个非常具体的应用程序(调试到端口),所以我可以应付。我不喜欢编写额外的代码来解决看起来像错误的事情,特别是如果它是商业软件。-5
您能否将错误转换为警告而不会丢失所有其他检查?我仍然觉得它是工具链中的一个错误,所以我更希望它是一个警告,而不是沉默,以便有一个事件和一些文档的钩子,并且出现另一个错误的可能性更小。否则关闭错误。+1(警告) 0(错误)
关闭错误似乎失去了(恕我直言)IAR 欠您一个解释和长期修复的“企业意识”,但它似乎比弄乱构建系统、使用标准库向 futz 编写宏脏东西要好得多,或者编写自己的代码会增加成本。
可能只是我,但我不喜欢编写代码来解决商业产品的缺陷。感觉这是供应商应该很高兴有机会证明其许可成本的地方。我记得微软向我们收取了事故费用,但如果问题被证明是他们的,事故和修复都是免费的。正确的做法似乎是给他们一个赚钱的机会。产品会有错误,所以默默地解决它而不给他们机会修复它似乎也没有多大帮助。