https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109789

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2023-05-12
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
A better reduction:

extern float fabsf(float);

typedef long unsigned size_t;

float dsp_abs_max_ret;

extern float lsp_dsp_abs_max(void);

float dsp_abs_max(float *buf, size_t size) {
  for (size_t i = 0; i < size; i++)
    if (fabsf(buf[i]) > 1e-20f)
      dsp_abs_max_ret = fabsf(buf[i]);
  return dsp_abs_max_ret;
}
void export_audio(int nframes, float init, int count) {
  do {
    float tmp_l[nframes];
    for (int i = 0; i < nframes; i++)
      tmp_l[i] = init;
    float max_amp = dsp_abs_max(tmp_l, nframes);
  } while (--count);
}


a.c.i: In function ‘dsp_abs_max’:
a.c.i:11:18: error: use of uninitialized value ‘*buf_16(D) + _1’ [CWE-457]
[-Werror=analyzer-use-of-uninitialized-value]
   11 |     if (fabsf(buf[i]) > 1e-20f)
      |               ~~~^~~
  ‘export_audio’: events 1-5
    |
    |   15 | void export_audio(int nframes, float init, int count) {
    |      |      ^~~~~~~~~~~~
    |      |      |
    |      |      (1) entry to ‘export_audio’
    |   16 |   do {
    |   17 |     float tmp_l[nframes];
    |      |           ~~~~~
    |      |           |
    |      |           (2) region created on stack here
    |   18 |     for (int i = 0; i < nframes; i++)
    |      |                     ~~~~~~~~~~~
    |      |                       |
    |      |                       (3) following ‘false’ branch (when ‘i >=
nframes’)...
    |   19 |       tmp_l[i] = init;
    |   20 |     float max_amp = dsp_abs_max(tmp_l, nframes);
    |      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                     |
    |      |                     (4) ...to here
    |      |                     (5) calling ‘dsp_abs_max’ from ‘export_audio’
    |
    +--> ‘dsp_abs_max’: events 6-9
           |
           |    9 | float dsp_abs_max(float *buf, size_t size) {
           |      |       ^~~~~~~~~~~
           |      |       |
           |      |       (6) entry to ‘dsp_abs_max’
           |   10 |   for (size_t i = 0; i < size; i++)
           |      |                      ~~~~~~~~
           |      |                        |
           |      |                        (7) following ‘true’ branch (when ‘i
< size’)...
           |   11 |     if (fabsf(buf[i]) > 1e-20f)
           |      |               ~~~~~~
           |      |                  |
           |      |                  (8) ...to here
           |      |                  (9) use of uninitialized value ‘*buf_16(D)
+ _1’ here
           |
a.c.i:11:18: error: use of uninitialized value ‘*buf_16(D) + _1’ [CWE-457]
[-Werror=analyzer-use-of-uninitialized-value]
   11 |     if (fabsf(buf[i]) > 1e-20f)
      |               ~~~^~~
  ‘export_audio’: events 1-5
    |
    |   15 | void export_audio(int nframes, float init, int count) {
    |      |      ^~~~~~~~~~~~
    |      |      |
    |      |      (1) entry to ‘export_audio’
    |   16 |   do {
    |   17 |     float tmp_l[nframes];
    |      |           ~~~~~
    |      |           |
    |      |           (2) region created on stack here
    |   18 |     for (int i = 0; i < nframes; i++)
    |      |                     ~~~~~~~~~~~
    |      |                       |
    |      |                       (3) following ‘false’ branch (when ‘i >=
nframes’)...
    |   19 |       tmp_l[i] = init;
    |   20 |     float max_amp = dsp_abs_max(tmp_l, nframes);
    |      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                     |
    |      |                     (4) ...to here
    |      |                     (5) calling ‘dsp_abs_max’ from ‘export_audio’
    |
    +--> ‘dsp_abs_max’: events 6-11
           |
           |    9 | float dsp_abs_max(float *buf, size_t size) {
           |      |       ^~~~~~~~~~~
           |      |       |
           |      |       (6) entry to ‘dsp_abs_max’
           |   10 |   for (size_t i = 0; i < size; i++)
           |      |                      ~~~~~~~~
           |      |                        |
           |      |                        (7) following ‘true’ branch (when ‘i
< size’)...
           |      |                        (9) following ‘true’ branch (when ‘i
< size’)...
           |   11 |     if (fabsf(buf[i]) > 1e-20f)
           |      |               ~~~~~~
           |      |                  |
           |      |                  (8) ...to here
           |      |                  (10) ...to here
           |      |                  (11) use of uninitialized value
‘*buf_16(D) + _1’ here
           |
a.c.i:12:34: error: use of uninitialized value ‘*buf_16(D) + _5’ [CWE-457]
[-Werror=analyzer-use-of-uninitialized-value]
   12 |       dsp_abs_max_ret = fabsf(buf[i]);
      |                               ~~~^~~
  ‘export_audio’: events 1-5
    |
    |   15 | void export_audio(int nframes, float init, int count) {
    |      |      ^~~~~~~~~~~~
    |      |      |
    |      |      (1) entry to ‘export_audio’
    |   16 |   do {
    |   17 |     float tmp_l[nframes];
    |      |           ~~~~~
    |      |           |
    |      |           (2) region created on stack here
    |   18 |     for (int i = 0; i < nframes; i++)
    |      |                     ~~~~~~~~~~~
    |      |                       |
    |      |                       (3) following ‘false’ branch (when ‘i >=
nframes’)...
    |   19 |       tmp_l[i] = init;
    |   20 |     float max_amp = dsp_abs_max(tmp_l, nframes);
    |      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                     |
    |      |                     (4) ...to here
    |      |                     (5) calling ‘dsp_abs_max’ from ‘export_audio’
    |
    +--> ‘dsp_abs_max’: events 6-11
           |
           |    9 | float dsp_abs_max(float *buf, size_t size) {
           |      |       ^~~~~~~~~~~
           |      |       |
           |      |       (6) entry to ‘dsp_abs_max’
           |   10 |   for (size_t i = 0; i < size; i++)
           |      |                      ~~~~~~~~
           |      |                        |
           |      |                        (7) following ‘true’ branch (when ‘i
< size’)...
           |   11 |     if (fabsf(buf[i]) > 1e-20f)
           |      |        ~         ~
           |      |        |         |
           |      |        |         (8) ...to here
           |      |        (9) following ‘true’ branch...
           |   12 |       dsp_abs_max_ret = fabsf(buf[i]);
           |      |                               ~~~~~~
           |      |                                  |
           |      |                                  (10) ...to here
           |      |                                  (11) use of uninitialized
value ‘*buf_16(D) + _5’ here
           |
a.c.i:12:34: error: use of uninitialized value ‘*buf_16(D) + _5’ [CWE-457]
[-Werror=analyzer-use-of-uninitialized-value]
   12 |       dsp_abs_max_ret = fabsf(buf[i]);
      |                               ~~~^~~
  ‘export_audio’: events 1-5
    |
    |   15 | void export_audio(int nframes, float init, int count) {
    |      |      ^~~~~~~~~~~~
    |      |      |
    |      |      (1) entry to ‘export_audio’
    |   16 |   do {
    |   17 |     float tmp_l[nframes];
    |      |           ~~~~~
    |      |           |
    |      |           (2) region created on stack here
    |   18 |     for (int i = 0; i < nframes; i++)
    |      |                     ~~~~~~~~~~~
    |      |                       |
    |      |                       (3) following ‘false’ branch (when ‘i >=
nframes’)...
    |   19 |       tmp_l[i] = init;
    |   20 |     float max_amp = dsp_abs_max(tmp_l, nframes);
    |      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                     |
    |      |                     (4) ...to here
    |      |                     (5) calling ‘dsp_abs_max’ from ‘export_audio’
    |
    +--> ‘dsp_abs_max’: events 6-11
           |
           |    9 | float dsp_abs_max(float *buf, size_t size) {
           |      |       ^~~~~~~~~~~
           |      |       |
           |      |       (6) entry to ‘dsp_abs_max’
           |   10 |   for (size_t i = 0; i < size; i++)
           |      |                      ~~~~~~~~
           |      |                        |
           |      |                        (7) following ‘true’ branch (when ‘i
< size’)...
           |      |                        (9) following ‘true’ branch (when ‘i
< size’)...
           |   11 |     if (fabsf(buf[i]) > 1e-20f)
           |      |                  ~
           |      |                  |
           |      |                  (8) ...to here
           |      |                  (10) ...to here
           |   12 |       dsp_abs_max_ret = fabsf(buf[i]);
           |      |                               ~~~~~~
           |      |                                  |
           |      |                                  (11) use of uninitialized
value ‘*buf_16(D) + _5’ here
           |
cc1: some warnings being treated as errors


It seems to be related to the use of a VLA for the array.

Reply via email to