记一次函数崩溃的现象分析,stack around the variable…was corrupted

1. 现象

详细如下图所示,在uint16_t定义的几个有关时间的变量处随机出现stack was corrupted,意思是堆栈已损坏。
记一次函数崩溃的现象分析,stack around the variable…was corrupted_第1张图片

2. 实现代码

time_t ConvertStrToTimestamp(const std::string &strTime)
{
    time_t tTimeStampRet;
    struct tm tTimeStamp;
#ifdef WIN32
    int16_t u16Year = 0;
    int16_t u16Month = 0;
    int16_t u16Day = 0;
    int16_t u16Hour = 0;
    int16_t u16Minutes = 0;
    uint16_t u16Seconds = 0;
    //"2017-11-26 22:30:59"
    sscanf(strTime.c_str(), "%d-%d-%d %d:%d:%d", &u16Year, &u16Month, &u16Day, &u16Hour, &u16Minutes, &u16Seconds);
    tTimeStamp.tm_year = u16Year - 1900;
    tTimeStamp.tm_mon = u16Month - 1;
    tTimeStamp.tm_mday = u16Day;
    tTimeStamp.tm_hour = u16Hour;
    tTimeStamp.tm_min = u16Minutes;
    tTimeStamp.tm_sec = u16Seconds;
#else
    char szBuf[128] = { 0 };
    strptime(szBuf, "%Y-%m-%d %H:%M:%S", &tTimeStamp);
#endif // WIN32
    tTimeStampRet = mktime(&tTimeStamp);
    return tTimeStampRet;
}

调用方式很简单,如下:

time_t str = ConvertStrToTimestamp("2017-11-26 23:26:01");

3. 解决方案

该问题最常见的是越界访问,比如你malloc了10个空间的元素或者数组大小为10,却去引用第11个元素的值,很明显是错误的。可是在上述代码中都是些临时变量,

3.1 修改工程属性

查找网上资料,修改C/C++代码生成属性的Basic Runtime Checks将熟悉/RTC1,等同于 /RTCsu改为默认属性,亲测了一下,可以解决该次崩溃问题,但是感觉应该这个不是主要原因,就继续深究代码。
记一次函数崩溃的现象分析,stack around the variable…was corrupted_第2张图片

3.2 scanf读取格式问题

说到底,还是基础不够扎实啊,修改后的代码:

sscanf(strTime.c_str(), "%hu-%hu-%hu %hu:%hu:%hu", &u16Year, &u16Month, &u16Day, &u16Hour, &u16Minutes, &u16Seconds);

uint16_t,unsigned short,在用sscanf读取的时候应使用%hu,而%d

你可能感兴趣的:(C/C++)