【问题标题】:Value of loop variable changes abruptly循环变量的值突然变化
【发布时间】:2015-07-19 05:23:35
【问题描述】:

我正在尝试从 2015 年 1 月 1 日到当前日期运行一个循环,并在数据库中填充每一天的值。我正在使用儒略日计数器作为循环变量。没有在循环内我正在更改计数器的值,但是在循环 2 次后,计数器的值突然变为垃圾值。可能是什么原因?

for (julian_day_counter = 2457024; julian_day_counter < curr_day; \
               julian_day_counter++)
    {
        for (slot_counter = 1; slot_counter < 24; slot_counter++)
        {
            consumption = (rand() % (CONSUMPTION_MAX_VAL - CONSUMPTION_MIN_VAL + 1)) \
                    + CONSUMPTION_MIN_VAL;

            /* Form current slot value column string based on current slot value */
            addr_port_strncpy((addr_u8bit_t *)slot_value_col, (addr_u8bit_t *)"slot_", \
                addr_port_strlen((addr_c8bit_t *)"slot_"));
            ADDR_SPRINTF(temp_str, "%d", slot_counter);
            addr_port_strncat((addr_s8bit_t *)slot_value_col, (addr_c8bit_t *)temp_str, \
               ADDR_SHORT_STR_LEN);

            /* Comma separated Column names */
            addr_port_strncat((addr_s8bit_t *)col_name,(addr_c8bit_t *)slot_value_col,
                ADDR_SHORT_STR_LEN);
            addr_port_strncat((addr_s8bit_t *)col_name, \
                (addr_c8bit_t *)" ,",ADDR_SHORT_STR_LEN);

            /* Comma separated Column values */
            ADDR_SPRINTF(temp_str, "%f ,", consumption); 
            addr_port_strncat((addr_s8bit_t *)col_value,
             (addr_c8bit_t *)temp_str, ADDR_SHORT_STR_LEN);
        }
        addr_port_strncat((addr_s8bit_t *)col_name, \
                (addr_c8bit_t *)"julian_day",ADDR_SHORT_STR_LEN);

        ADDR_SPRINTF(temp_str, "%d", julian_day_counter);
        addr_port_strncat((addr_s8bit_t *)col_value, \
            (addr_c8bit_t *)temp_str, ADDR_SHORT_STR_LEN);

        /* Insert row for consumption profile information in DB*/    
        if( ADDR_FAILURE == addr_db_local_insert(p_glb_pdb,
                ADDR_APPLIANCE_CONSUMPTION_PROFILE_TABLE, (addr_c8bit_t *)col_name,
                (addr_c8bit_t *)col_value))
        {
            ret_val = ADDR_FAILURE;
        }
    }

下面是gdb sn-p:

Breakpoint 1, addr_db_update_dummy_appliance_consumption_profile (
    p_glb_pdb=0x812a4b0, curr_day=2457151)
    at addr_db_app.c:13184
13184       addr_s8bit_t         temp_str[ADDR_SHORT_STR_LEN] = {'\0'}; 
(gdb) watch julian_day_counter
Hardware watchpoint 2: julian_day_counter
(gdb) c
Continuing.
Hardware watchpoint 2: julian_day_counter

Old value = 0
New value = 2457024
0x08088d55 in addr_db_update_dummy_appliance_consumption_profile (
    p_glb_pdb=0x812a4b0, curr_day=2457151)
    at addr_db_app.c:13208
13208       for (julian_day_counter = 2457024; julian_day_counter < curr_day; \
(gdb) c
Continuing.
Hardware watchpoint 2: julian_day_counter

Old value = 2457024
New value = 2457025
0x08088f2d in addr_db_update_dummy_appliance_consumption_profile (
    p_glb_pdb=0x812a4b0, curr_day=2457151)
    at addr_db_app.c:13208
13208       for (julian_day_counter = 2457024; julian_day_counter < curr_day; \
(gdb) c
Continuing.
Hardware watchpoint 2: julian_day_counter

Old value = 2457025
New value = 2456880
0x00b6a33b in strncat () from /lib/libc.so.6

【问题讨论】:

  • julian_day_calendar是什么类型?
  • 一旦这些 strncats 可能会覆盖它。
  • 是的,你能让代码更复杂一些吗?谢谢。
  • 您的 gdb 日志中有答案。 strncat 正在按照 cnicutar 的建议覆盖它。
  • 呃……minimal example 怎么样?

标签: c variables


【解决方案1】:

这里真正的线索是:

0x00b6a33b in strncat() from /lib/libc.so.6

您的值在导致strncat 的其他函数调用中被修改。然而,目前的问题并不存在违规代码。 :)

【讨论】:

  • 那么解决办法是什么? (这很简单)@undur_gongor 最初指出这一点做得很好。
  • 对不起,但我仍然无法获得.. julian_day_counter 甚至没有在 strncat 函数中使用。
  • @undur_gongor 这些显然是某种包装函数。它们很可能是问题所在,但是如果不查看包装函数在调用 strncat 之前、期间和之后对传入的参数做了什么,就不可能说出导致行为的原因。
  • 我同意:由于代码不完整,我们只是猜测。
【解决方案2】:

@undur_gongor 做得很好,因为您在 cmets 中针对您的问题指出了这一点;罪魁祸首是strncat()。它正在覆盖缓冲区并破坏其他变量。你有一个缓冲区溢出。

您似乎没有正确传递第三个参数;来自this question

#define BUFFER_SIZE 64
char buff[BUFFER_SIZE];

//Use strncpy
strncpy(buff, "String 1", BUFFER_SIZE - 1);
buff[BUFFER_SIZE - 1] = '\0';

strncat(buff, "String 2", BUFFER_SIZE - strlen(buff) - 1);

strncat(buff, "String 3", BUFFER_SIZE - strlen(buff) - 1);

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多