我们刚刚发现我们的同事认为他可以在std :: string中添加一个整数,并在他的代码中使用此类操作。
我们没有看到此操作的任何编译器错误,我不明白为什么:没有operator+ (const string& lhs, int rhs);
。 int是否默默地转换为char? (使用gcc Red Hat 4.1.2和-Wall开关编译)。
而且,最重要的是,我们如何找到int添加到std :: string的所有行?
答案 0 :(得分:3)
当你的同事只使用整数文字时,它们会转换为char
- 但是如果整数的值太大,你会看到一个警告。被调用的运算符是
std::string operator+(const std::string &s, char c); // actually it's basic_string<> with some CharT...
或+=
变种;)
关于如何查找所有电话。您可以编译(无内联)所有运算符出现的所有代码objdump
,grep
,并对过滤后的地址使用addr2line
:
$ cat string-plus.cpp
#include <string>
int main()
{
std::string a = "moof ";
a += 192371;
}
$ g++ -g string-plus.cpp
string-plus.cpp: In function ‘int main()’:
string-plus.cpp:5: warning: overflow in implicit constant conversion
$ objdump -Cd a.out | \
grep 'call.*std::string::operator+=(char)@plt' | \
tr -d ' ' | \
cut -d: -f1 | \
xargs addr2line -Cfe string-plus
main
??:0
然而,这没有给我行号...至少呼叫站点在那里;)
-C
开关启用c ++名称demangling。也可以使用binutls c++filt
手动完成。
有趣的是, 是operator+
和string
的{{1}}定义,但只有在使用char
时才会转换整数文字到operator+=
,我必须为char
传递char
字面值(或值)才能使用。
查找运营商的受损名称:
operator+
最后一个是您要搜索的名称 - 可用于grep w / o名称demangling。
我真的不知道更好的方法......:/