【发布时间】:2015-07-12 09:36:44
【问题描述】:
这个问题出现在这个问题的上下文中:Find unexecuted lines of c++ code
在搜索这个问题时,大多数人都试图将代码和变量添加到同一部分 - 但这绝对不是这里的问题。这是一个最小的工作示例:
unsigned cover() { return 0; }
#define COV() do { static unsigned cov[2] __attribute__((section("cov"))) = { __LINE__, cover() }; } while(0)
inline void foo() {
COV();
}
int main(int argc, char* argv[])
{
COV();
if (argc > 1)
COV();
if (argc > 2)
foo();
return 0;
}
导致g++ -std=c++11 test.cpp (g++ (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)) 出现以下错误:
test.cpp:6:23: error: cov causes a section type conflict with cov
COV();
^
test.cpp:11:30: note: ‘cov’ was declared here
COV();
^
虽然这个错误不是很有帮助,因为它没有说明为什么这应该是一个冲突。 .ii 和 .s 临时文件都没有提示可能是什么问题。实际上.s文件中只有一个节定义
.section cov,"aw",@progbits
我不明白为什么下一个定义应该与这个冲突(“aw”,@progbits 是正确的......)。
有什么方法可以获取更多信息吗?看看具体是什么 冲突是什么?或者这只是一个错误......?
【问题讨论】:
-
这个问题与Inline static data causes a section type conflict 完全相同,我写了接受的答案并附有详细解释,the OP's own subsequent solution 更好。 GCC 不支持在问题中使用
__attribute__。 -
@MikeKinghan 建议:1/ 从副本中总结您的出色答案。 2/ 赚取赏金。 3/关闭问题重复。
-
@YSC 很受诱惑,但我觉得为我以前的答案提升 295 个代表然后通过总结它再提升 100 个左右的代表是不合适的 - 当我只有机会由于在获得赏金之前没有及时注意到这个骗局并对其进行近距离投票!
-
@Mike - 据我所知,您其他答案中的分析是正确的。然而,这个问题与识别问题部分有关。这就是为什么:“此赏金试图通过查明违规者来获得解决冲突的规范答案”。 (我们也有同样的问题。我们有将近 200 个目标文件,我们不知道是哪些符号导致了失败。我们无法从数百个目标文件中手动检查数十万个符号)