printf : Is this safe?

后端 未结 3 669
陌清茗
陌清茗 2021-01-14 01:52

I am just wondering if this expression is safe :

int main (void)
{
  char my_tab[256];

  memset(my_tab,0x61,sizeof(my_tab));

  printf(\"Is it safe ? : %.2         


        
3条回答
  •  爱一瞬间的悲伤
    2021-01-14 02:17

    It's safe.

    From printf(3) - Linux manual page http://man7.org/linux/man-pages/man3/printf.3.html :

       s      If no l modifier is present: The const char * argument is
              expected to be a pointer to an array of character type
              (pointer to a string).  Characters from the array are written
              up to (but not including) a terminating null byte ('\0'); if a
              precision is specified, no more than the number specified are
              written.  If a precision is given, no null byte need be
              present; if the precision is not specified, or is greater than
              the size of the array, the array must contain a terminating
              null byte.
    

    Function vsnprintf in /lib/vsprintf.c call strnlen(s, spec.precision) to get the lenth of the string to be formatted:

    /**
     * strnlen - Find the length of a length-limited string
     * @s: The string to be sized
     * @count: The maximum number of bytes to search
     */
    size_t strnlen(const char *s, size_t count)
    {
        const char *sc;
    
        for (sc = s; count-- && *sc != '\0'; ++sc)
            /* nothing */;
        return sc - s;
    }
    

    Only the valid char bytes will be accessed.

    static noinline_for_stack
    char *string(char *buf, char *end, const char *s, struct printf_spec spec)
    {
        int len, i;
    
        if ((unsigned long)s < PAGE_SIZE)
            s = "(null)";
    
        len = strnlen(s, spec.precision);
    
        if (!(spec.flags & LEFT)) {
            while (len < spec.field_width--) {
                if (buf < end)
                    *buf = ' ';
                ++buf;
            }
        }
        for (i = 0; i < len; ++i) {
            if (buf < end)
                *buf = *s;
            ++buf; ++s;
        }
        while (len < spec.field_width--) {
            if (buf < end)
                *buf = ' ';
            ++buf;
        }
    
        return buf;
    }
    

提交回复
热议问题