Search code examples
cstringcharstrlenunsigned-char

warning about strlen() on BYTE type


I am trying to compute the hash value of some words using sha256, but when I use sha256_update() function,

typedef unsigned char BYTE;
BYTE text1[] = {"abcd"};
sha256_update(&ctx, text1, strlen(text1));

use strlen() on BYTE type will give me some warnings, so I want to know what is the proper way to get the length of the text1?

In file included from /usr/include/memory.h:29:0,
             from sha256-test.c:16:
/usr/include/string.h:384:15: note: expected ‘const char *’ but argument is of type ‘BYTE {aka unsigned char}’
 extern size_t strlen (const char *__s)
           ^~~~~~
sha256-test.c:54:36: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness [-Wpointer-sign]
  sha256_update(&ctx, text1, strlen(text1));

Solution

  • It looks like the typedef name BYTE is defined the following way

    typedef unsigned char BYTE;
    

    In this case cast the type unsigned char * to type char * (or to const char * ) because there is no implicit conversion between the types. For example

    BYTE text1[] = {"abcd"};
    sha256_update(&ctx, text1, strlen( ( char * )text1 ) );
    

    Take into account that for such initialization of the array

    BYTE text1[] = {"abcd"};
    

    (when the size of an array is determinated by its initialization with a string) you can get the length of the string also the following way

    sizeof( text1 ) - 1
    

    Here is a demonstrative program

    #include <string.h>
    #include <stdio.h>
    
    typedef unsigned char BYTE;
    
    int main( void )
    {
        BYTE text1[] = {"abcd"};
        size_t n = strlen( ( char * )text1 );
    
        printf( "n = %zu\n", n );
        printf( "sizeof( text1 ) - 1 = %zu\n", sizeof( text1 ) - 1 );
    }
    

    Its output is

    n = 4
    sizeof( text1 ) - 1 = 4