使用std::string容易犯的一个很难发现的bug

前一阵子同事说他的一段code老出AV,但是查不出来什么毛病,让我帮他看看。仔细看了半天才发现了这么一句:

string s = "xxxx";

….

printf("%s", s);

他的本意是输出这个字符串,因为string有const char*的类型转换操作符所以他就没有写。可是却忘了printf是一个变参函数,后面的东西都是。。。里面的,这就意味这编译期间编译器根本不知道printf需要什么参数,编译器所生成的应该只是将这个对象的第一个dword压栈,然后调用printf。然后printf解析格式化字符串,发现s%后便试图按照const char*去解释对应的参数。

这样如果string的memory layout中第一个dword不是所对应的字符串的地址,那就可能出问题了

将其改成printf("%s", s.c_str())之后,就没有问题了。

后来问同事原来他的代码以前是用char *的,后来做了一次refactor,用string来代替所有的字符指针,便出现了这个问题。当时就想把这个问题写下来后来因为忙就忘记了,但是上周末跟另外一个同事改写他的代码的时候,又遇到了同样的问题,想想还是写下来留个纪念吧

Advertisements
This entry was posted in Win32 Programming. Bookmark the permalink.

11 Responses to 使用std::string容易犯的一个很难发现的bug

  1. Peter says:

    看来C和C++混用就是容易出问题,应该把C++作为一个Java这样的新语言,完全不许用非面向对象的C库函数就好了

  2. Xuan says:

    的确是这个样子的,这种问题一般都处在c/c++混用或者由c向c++转变的阶段

  3. Unknown says:

    Amberdigital Branch,Southern Stars Enterprises Co is specializing in the development and manufacturing of advertisement screens, LCD digital signage and LCD signages. Established in 1996, we have explored and developed the international market with professionalism. We have built a widespread marketing network, and set up a capable management team dedicated to provide beyond-expectation services to our customers.

    amberdigital Contact Us

    Southern Stars Enterprises Co (Shenzhen Office)
    Add:DE, 16/F, Building 2, Nanguo Tower, Sungang Road, Shenzhen, China
    E-mail:sstar@netvigator.com carol@sstar-hk.com
    Tel:+86 755 2592 9100
    Fax:+86 755 2592 7171
    website:http://http://www.amberdigital.com.hk
    alibaba:http://amberdigital.en.alibaba.com%5Baeibddgbhaf

  4. Unknown says:

    A friend to buy wow goldTo wow power leveling?On the world\’s most concessions to the most reputable sites under the single!

  5. Unknown says:

    您需要二手液晶显示屏、废旧液晶屏么?我们是不折不扣的二手液晶屏、旧液晶屏大批发商,长期大量供应可再利用的旧液晶屏。我公司提供的各种尺寸的二手液晶屏, 不同厚薄如笔记本屏,均已经过我们严格的分类,检验,测试流程。请访问协力液晶屏www.sceondhandlcd.com[cageiedahgbcda]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s