Bug 46345 - nss: ошибка сборки с GCC 13
Summary: nss: ошибка сборки с GCC 13
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: nss (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 45802
  Show dependency tree
 
Reported: 2023-06-01 07:47 MSK by Alexey Sheplyakov
Modified: 2023-06-12 22:47 MSK (History)
6 users (show)

See Also:


Attachments
патч для исправления ошибки (3.33 KB, patch)
2023-06-01 07:58 MSK, Alexey Sheplyakov
no flags Details | Diff
ещё один вариант исправления (4.20 KB, patch)
2023-06-01 21:03 MSK, Alexey Sheplyakov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey Sheplyakov 2023-06-01 07:47:06 MSK
[1382/1456] CC obj/cmd/ecperf/ecperf.ecperf.o
FAILED: obj/cmd/ecperf/ecperf.ecperf.o
gcc -MMD -MF obj/cmd/ecperf/ecperf.ecperf.o.d -DNSS_USE_STATIC_LIBS -DNSS_FIPS_DISABLED -DNSS_NO_INIT_SUPPORT -DNSS_USE
_64 -DUSE_UTIL_DIRECTLY -DNO_NSPR_10_SUPPORT -DSSL_DISABLE_DEPRECATED_CIPHER_SUITE_NAMES -DLINUX2_1 -DLINUX -Dlinux -D_
DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_SOURCE -DSDB_MEASURE_USE_TEMP_DIR -DHAVE_STRERROR -DXP_UNIX -D_REENTRANT -DNDEBUG
 -I../../lib/softoken -I/usr/include/nspr -I/usr/src/RPM/BUILD/nss-3.89.0/dist/private/nss -I/usr/src/RPM/BUILD/nss-3.8
9.0/dist/public/dbm -I/usr/src/RPM/BUILD/nss-3.89.0/dist/public/nss -fPIC -pipe -ffunction-sections -fdata-sections -We
rror -Wall -Wshadow -O2 -std=c99  -c ../../cmd/ecperf/ecperf.c -o obj/cmd/ecperf/ecperf.ecperf.o
../../cmd/ecperf/ecperf.c: In function 'genericThread':
../../cmd/ecperf/ecperf.c:99:24: error: storing the address of local variable 'sig' in '*threadData.p2' [-Werror=dangli
ng-pointer=]
   99 |         threadData->p2 = (void *)&sig;
      |         ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
../../cmd/ecperf/ecperf.c:91:13: note: 'sig' declared here
   91 |     SECItem sig;
      |             ^~~
../../cmd/ecperf/ecperf.c:86:21: note: 'data' declared here
   86 | genericThread(void *data)
      |               ~~~~~~^~~~
../../cmd/ecperf/ecperf.c: In function 'PKCS11Thread':
../../cmd/ecperf/ecperf.c:71:24: error: storing the address of local variable 'sig' in '*threadData.p2' [-Werror=dangli
ng-pointer=]
   71 |         threadData->p2 = (void *)&sig;
      |         ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
../../cmd/ecperf/ecperf.c:53:13: note: 'sig' declared here
   53 |     SECItem sig;
      |             ^~~
../../cmd/ecperf/ecperf.c:47:20: note: 'data' declared here
   47 | PKCS11Thread(void *data)
      |              ~~~~~~^~~~
cc1: all warnings being treated as errors
Comment 1 Alexey Sheplyakov 2023-06-01 07:58:47 MSK
Created attachment 13353 [details]
патч для исправления ошибки
Comment 2 Alexey Gladkov 2023-06-01 19:50:26 MSK
(Ответ для Alexey Sheplyakov на комментарий #1)
> Создано вложение 13353 [details] [подробности]
> патч для исправления ошибки

Это не исправление ошибки, а игнорирование.
Но спасибо за патч.
Comment 3 Alexey Sheplyakov 2023-06-01 20:34:21 MSK
(Ответ для Alexey Gladkov на комментарий #2)
> (Ответ для Alexey Sheplyakov на комментарий #1)
> > Создано вложение 13353 [details] [подробности]
> > патч для исправления ошибки
> 
> Это не исправление ошибки, а игнорирование.

Нет. threadData->p2 действительно содержит адрес локальной переменной. Но threadData->p2 читает только поток, входной точкой которого является функция genericThread (для того, чтобы вызвать нужную функцию в данном потоке). А основной поток читает только threadData->count.

Но компилятор об этом знать не может (он вообще про потоки не знает), так что ему надо помочь.

Можно было переписать код примерно так:

46 void
 47 PKCS11Thread(void *data)
 48 {
 49     ThreadData *threadData = (ThreadData *)data;
 50     pk11_op_func op = (pk11_op_func)threadData->op;
 51     int iters = threadData->iters;
 52     unsigned char sigData[256];
 53     SECItem sig;
 54     CK_SESSION_HANDLE session;
 55     CK_RV crv;
 56     void *p2 = threadData->p2;
 57     
 58     threadData->status = SECSuccess;
 59     threadData->count = 0;
 60     
 61     /* get our thread's session */
 62     PR_Lock(threadData->lock);
 63     crv = NSC_OpenSession(1, CKF_SERIAL_SESSION, NULL, 0, &session);
 64     PR_Unlock(threadData->lock);
 65     if (crv != CKR_OK) {
 66         return;
 67     }
 68 
 69     if (threadData->isSign) {
 70         sig.data = sigData; 
 71         sig.len = sizeof(sigData);
 72         p2 = (void *)&sig;
 73     }   
 74 
 75     while (iters--) {
 76         threadData->status = (*op)(session, threadData->p1,
 77                                    p2, threadData->p3);
 78         if (threadData->status != SECSuccess) {
 79             break;
 80         }   
 81         threadData->count++;
 82     }   
 83     return;
 84 }   

Но не хочется делать это только ради того, чтобы ублажить компилятор.
И при беглом взгляде возникает вопрос - а зачем эта возня с p2, почему нельзя просто threadData->p2 использовать?


Технически значение thre
> Но спасибо за патч.
Comment 4 Alexey Sheplyakov 2023-06-01 21:03:44 MSK
Created attachment 13363 [details]
ещё один вариант исправления
Comment 5 Alexey Sheplyakov 2023-06-01 21:05:24 MSK
(Ответ для Alexey Sheplyakov на комментарий #4)
> Создано вложение 13363 [details] [подробности]
> ещё один вариант исправления

Собственно взял и переписал, как рассказал в предыдущем комментарии. А кому существование p2 покажется странным наверное сможет посмотреть в git blame.
Comment 6 Alexey Gladkov 2023-06-12 22:47:03 MSK
gcc13 в сизифе нет, но я верю, что в nss 3.90.0-alt1 всё исправлено.