Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[Bug] rt_vsnprintf格式化long long数值错误

Ouverte
#11,596 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@CYFS3 y travaille déjà.

Depuis le 9/7/2026.

  • #11600 par @CYFS3 — ouverte

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Calme
Stack technique
c

Piste de recherche

Commencez dans rt_vsnprintf_tiny.c, au niveau de rt_vsnprintf et print_number, en vous concentrant sur la manière dont les qualificateurs 'l' et 'L' gèrent les valeurs signées et non signées. Exécutez les cas de formatage INT32 et INT64 fournis et comparez rt_kprintf à printf. C’est terminé lorsque les valeurs long long signalées correspondent à la sortie printf attendue.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

RT-Thread Version

all

Hardware Type/Architectures

all

Develop Toolchain

Other

Describe the bug

rt_vsnprintf_tiny.c 中rt_vsnprintf函数格式化long long数值错误,主要原因是print_number中将 'l' 与 'L'合并处理了

        switch (qualifier)
        {
        case 'h':
            if ((rt_int16_t)num < 0)
            {
                sign = '-';
                num = (rt_uint16_t)-num;
            }
            break;
        case 'L':
        case 'l':
            if ((long)num < 0)
            {
                sign = '-';
                num = (unsigned long)-num;
            }
            break;

使用以下代码测出结果不同

rt_kprintf("rt_kprintf: INT32_MIN = %lld\n", (int64_t)INT32_MIN);
printf("printf: INT32_MIN = %lld\n", (int64_t)INT32_MIN);
rt_kprintf("rt_kprintf: UINT32_MAX = %lld\n", (int64_t)UINT32_MAX);
printf("printf: UINT32_MAX = %lld\n", (int64_t)UINT32_MAX);
rt_kprintf("rt_kprintf: INT64_MIN = %lld\n", (int64_t)INT64_MIN);
printf("printf: INT64_MIN = %lld\n", (int64_t)INT64_MIN);
rt_kprintf("rt_kprintf: INT64_MAX = %lld\n", (int64_t)INT64_MAX);
printf("printf: INT64_MAX = %lld\n", (int64_t)INT64_MAX);

测试结果

rt_kprintf: INT32_MIN = -2147483648
printf: INT32_MIN = -2147483648
rt_kprintf: UINT32_MAX = -1
printf: UINT32_MAX = 4294967295
rt_kprintf: INT64_MIN = 9223372036854775808
printf: INT64_MIN = -9223372036854775808
rt_kprintf: INT64_MAX = -1
printf: INT64_MAX = 9223372036854775807
Other additional context

No response

Langage dominant
C
Étoiles
12.3k
Forks
5.5k
Merge moyen
4 j 12 h
PR mergées (30 j)
32

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de RT-Thread/rt-thread

Toutes les issues de RT-Thread/rt-thread

Issues similaires

Plus d'issues C

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.