2015-06-05 57 views
0

我試圖編寫解決以下問題的函數(這是無關緊要的,我將其描述爲描述下面的代碼):在valgrind中,wprintf會引起「條件跳轉還是移動取決於未初始化的值」?

給定一個單詞和規則的形式:「lhs- > rhs「其中word = lhs ^後綴,輸出rhs ^後綴,例如:

如果一個單詞是」輸入「並且規則是」in-out「,則該函數將返回單詞」output「如果該規則不能用於該單詞,則爲NULL。

雖然有一個轉折:「lhs」可能還包含數字變量(除了字母),例如, G。 「01-> 10」,在這種情況下,該規則將在「niput」上使用時將「niput」轉換爲「input」(因此數字對應於站在特定位置的字母)。

下面的代碼:

#include <wchar.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define MAX_WORD_SIZE 101 

wchar_t *transform_by_rule(wchar_t *word, wchar_t *lhs, wchar_t *rhs) 
{ 
    int i; 
    long int wint; 
    int lhs_len = wcslen(lhs); 
    int rhs_len = wcslen(rhs); 
    int word_len = wcslen(word); 

    // Initial check - does lhs fit to word 
    if (word_len < lhs_len) 
     return NULL; 
    for (i = 0; i < lhs_len; i++) 
    { 
     if (iswdigit(lhs[i])) 
      continue; 
     else 
     { 
      if (lhs[i] != word[i]) 
       return NULL; 
     } 
    } 

    wchar_t *result = 
     malloc((rhs_len + 1) * sizeof(wchar_t)); 
    wchar_t int_wchar_map[10]; 
    for (i = 0; i < lhs_len; i++) 
    { 
     if (iswdigit(lhs[i])) 
     { 
      wint = lhs[i] - L'0'; 
      int_wchar_map[wint] = word[i]; 
     } 
    } 
    for (i = 0; i < rhs_len; i++) 
    { 
     if (iswdigit(rhs[i])) 
     { 
      wint = rhs[i] - L'0'; 
      result[i] = int_wchar_map[wint]; 
     } 
     else 
     { 
      result[i] = rhs[i]; 
     } 
    } 
    return result; 
} 


int main() 
{ 
    wchar_t word[MAX_WORD_SIZE]; 
    wchar_t lhs[MAX_WORD_SIZE]; 
    wchar_t rhs[MAX_WORD_SIZE]; 
    wscanf(L"%ls", word); 
    wscanf(L"%ls", lhs); 
    wscanf(L"%ls", rhs); 
    wchar_t *result = transform_by_rule(word, lhs, rhs); 
    if (result != NULL) 
    { 
     wprintf(L"%ls\n", result); // line 67 
     free(result); 
    } 
    else 
    { 
     puts("Rule doesn't fit to word."); 
    } 
    return 0; 
} 

這裏的問題。當輸入 「A」(字), 「一」(左), 「B」(右),在Valgrind的輸出錯誤的valgrind下運行:

==6094== Conditional jump or move depends on uninitialised value(s) 
==6094== at 0x4C30E19: wcslen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==6094== by 0x4E8C3F6: vfwprintf (in /usr/lib64/libc-2.20.so) 
==6094== by 0x4EA7448: wprintf (in /usr/lib64/libc-2.20.so) 
==6094== by 0x4009AA: main (main.c:67) 

我看不到我的代碼任何問題。這是wprintf()的問題嗎?

+1

通常這個警告可以通過使用calloc()來解決 –

回答

1

result在從transform_by_rule()返回之前沒有零終止。因此,當在其返回值上調用wprintf()時,wprintf()可能會被讀出,因爲它在分配的內存塊中可能不會遇到終止寬字符。

使用wchar_t *result = calloc(rhs_len + 1, sizeof(wchar_t));,並且如果您確定不會在transform_by_rule()內邊界上寫入,則會自動獲得正確終止的字符串。

相關問題