0

Pebble ウォッチフェイスのバッテリー表示を更新するとき、バッテリー レベルを int s_battery_level に取得し、toString 関数を実行して (これは 100% の時間で動作します。テスト済みです)、% と null ターミネータを追加します。 、ちょうどいい尺度です。ただし、何らかの理由で、その行を実行すると、バッテリーが 100% から 90% (または 100 から任意の下位の数字) に低下すると、ヒープ破損エラーが発生します。null ターミネータを削除/追加しようとしましたが、strcat() と strncat() の両方を使用し、% をエスケープしても、何も機能していないようです。問題のある行を削除すると、完全に機能します。

この行がヒープを破損しているのはなぜですか? オプションで、どうすれば修正/回避できますか?

static void battery_update_proc(Layer *layer, GContext *ctx) {
  graphics_context_set_text_color(ctx, TxtColor);
  char * lvl = calloc(6,sizeof(char));
  lvl = toString(s_battery_level, lvl);
  //strncat(lvl, "%\0", 2);
  //offending line above ^
  APP_LOG(APP_LOG_LEVEL_DEBUG, "%s", lvl);
  graphics_draw_text(ctx, lvl, s_txt_font, GRect(bound.origin.x + ROUND_OFFSET_BA_X, bound.size.h * .5 + ROUND_OFFSET_BA_Y, bound.size.w, 24), GTextOverflowModeWordWrap, GTextAlignmentCenter, NULL);
}

参考までに、toString 関数を次に示します。

char * toString(int value, char * result) {
    int digit = digits(value);
    result = calloc(digit + 1, sizeof(char));
    result[digit] = '\0';
    int usedVal = 0;
    for (int i = digit; i > 0; i--)
    {
        int x = (value - usedVal) / pwrOf10(i - 1);
        result[digit - i] = (char) x + '0';
        usedVal = usedVal + (result[digit - i] - '0') * pwrOf10(i - 1);
    }
    return result;
}

int digits(int n) {
    if (n < 0) return digits((n == 0) ? 9999 : -n);
    if (n < 10) return 1;
    return 1 + digits(n / 10);
}

int pwrOf10(int power) {
    int val = 1;
    int i = power;
    while (i > 0)
    {
        val *= 10;
        i--;
    }
return val;
}
4

2 に答える 2