<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">To whom it may concern,</p>
<p style="margin:0px 0px 1.2em!important">tl;dr I think I found a bug in the clang static analyzer.  Could someone please help me find a workaround/where to properly report the bug?</p>
<p style="margin:0px 0px 1.2em!important">I have a statement in a class initializer list:</p>
<p style="margin:0px 0px 1.2em!important"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr)</code></p>
<p style="margin:0px 0px 1.2em!important">rhs.has_data() is a const function that returns t/f if rhs.data_ptr != null</p>
<p style="margin:0px 0px 1.2em!important">rhs.size_in_bytes() a const function that returns the number of bytes in the structure <strong>if has_data was true</strong></p>
<p style="margin:0px 0px 1.2em!important">i.e. it is possible that rhs.has_data() is false, and rhs.size_in_bytes() > 0</p>
<p style="margin:0px 0px 1.2em!important">However the clang static analyzer seems to get a false positive here.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-console" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%">/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/include/g++-v8/bits/unique_ptr.h:831:34: note: Calling copy constructor for 'pressio_data'
../include/libpressio_ext/cpp/data.h:247:15: note: Left side of '&&' is true
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
              ^
../include/libpressio_ext/cpp/data.h:247:33: note: Assuming the condition is true
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
                                ^
../include/libpressio_ext/cpp/data.h:247:14: note: '?' condition is true
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
             ^
../include/libpressio_ext/cpp/data.h:247:66: note: Calling 'pressio_data::size_in_bytes'
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
                                                                 ^
../include/libpressio_ext/cpp/data.h:384:12: note: Calling 'data_size_in_bytes<unsigned long>'
    return data_size_in_bytes(data_dtype, num_dimensions(), dims.data());
           ^
../include/libpressio_ext/cpp/data.h:31:5: note: Returning zero
    return data_size_in_elements(dimensions, dims) * pressio_dtype_size(type);
    ^
../include/libpressio_ext/cpp/data.h:384:12: note: Returning from 'data_size_in_bytes<unsigned long>'
    return data_size_in_bytes(data_dtype, num_dimensions(), dims.data());
           ^
../include/libpressio_ext/cpp/data.h:384:5: note: Returning zero
    return data_size_in_bytes(data_dtype, num_dimensions(), dims.data());
    ^
../include/libpressio_ext/cpp/data.h:247:66: note: Returning from 'pressio_data::size_in_bytes'
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
                                                                 ^
../include/libpressio_ext/cpp/data.h:247:59: note: Call to 'malloc' has an allocation size of 0 bytes
    data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr),
</code></pre>
<p style="margin:0px 0px 1.2em!important">Is there a way to instruct the static analyzer that malloc cannot be called with size_in_bytes == 0 because saying (rhs.size_in_bytes() > 0) isn’t enough. I’m using clang-9.0.1 on gentoo.</p>
<p style="margin:0px 0px 1.2em!important">Respectfully,<br>Robert Underwood</p>
<div title="MDH:PGRpdj5UbyB3aG9tIGl0IG1heSBjb25jZXJuLDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+dGw7
ZHIgSSB0aGluayBJIGZvdW5kIGEgYnVnIGluIHRoZSBjbGFuZyBzdGF0aWMgYW5hbHl6ZXIuJm5i
c3A7IENvdWxkIHNvbWVvbmUgcGxlYXNlIGhlbHAgbWUgZmluZCBhIHdvcmthcm91bmQvd2hlcmUg
dG8gcHJvcGVybHkgcmVwb3J0IHRoZSBidWc/PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIGhhdmUgYSA8c3BhbiB6ZXVtNGMwPSIxNTgyOTAw
NDM4Mzc1IiBkYXRhLWRkbndhYj0iMTU4MjkwMDQzODM3NSIgY2xhc3M9Im5nIiBkYXRhLXdwa2d2
PSJ0cnVlIj5zdGF0ZW1lbnQ8L3NwYW4+IGluIGEgY2xhc3MgaW5pdGlhbGl6ZXIgbGlzdDo8L2Rp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBkYXRhX3B0cigocmhzLmhhc19kYXRhKCkgJmFtcDsmYW1w
OyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/IG1hbGxvYyhyaHMuc2l6ZV9pbl9ieXRlcygp
KSA6IG51bGxwdHIpYDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+cmhzLmhhc19kYXRhKCkgaXMg
YSBjb25zdCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdC9mIGlmIHJocy5kYXRhX3B0ciAhPSBudWxs
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5yaHMuc2l6ZV9pbl9ieXRlcygpIGEgY29uc3QgZnVu
Y3Rpb24gdGhhdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cnVjdHVyZSAq
KmlmIGhhc19kYXRhIHdhcyB0cnVlKio8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmkuZS4gaXQg
aXMgcG9zc2libGUgdGhhdCByaHMuaGFzX2RhdGEoKSBpcyBmYWxzZSwgYW5kIHJocy5zaXplX2lu
X2J5dGVzKCkgJmd0OyAwPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Ib3dldmVyIHRoZSBjbGFu
ZyBzdGF0aWMgYW5hbHl6ZXIgc2VlbXMgdG8gZ2V0IGEgZmFsc2UgcG9zaXRpdmUgaGVyZS48L2Rp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYGNvbnNvbGU8L2Rpdj48ZGl2Pi91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzguMy4wL2luY2x1ZGUvZysrLXY4L2JpdHMvdW5pcXVlX3B0ci5o
OjgzMTozNDogbm90ZTogQ2FsbGluZyBjb3B5IGNvbnN0cnVjdG9yIGZvciAncHJlc3Npb19kYXRh
Jzxicj4uLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3OjE1OiBub3RlOiBM
ZWZ0IHNpZGUgb2YgJyZhbXA7JmFtcDsnIGlzIHRydWU8YnI+Jm5ic3A7ICZuYnNwOyBkYXRhX3B0
cigocmhzLmhhc19kYXRhKCkgJmFtcDsmYW1wOyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/
IG1hbGxvYyhyaHMuc2l6ZV9pbl9ieXRlcygpKSA6IG51bGxwdHIpLDxicj4mbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgXjxicj4uLi9pbmNsdWRlL2xpYnBy
ZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3OjMzOiBub3RlOiBBc3N1bWluZyB0aGUgY29uZGl0aW9u
IGlzIHRydWU8YnI+Jm5ic3A7ICZuYnNwOyBkYXRhX3B0cigocmhzLmhhc19kYXRhKCkgJmFtcDsm
YW1wOyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/IG1hbGxvYyhyaHMuc2l6ZV9pbl9ieXRl
cygpKSA6IG51bGxwdHIpLDxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsgXjxicj4uLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRh
Lmg6MjQ3OjE0OiBub3RlOiAnPycgY29uZGl0aW9uIGlzIHRydWU8YnI+Jm5ic3A7ICZuYnNwOyBk
YXRhX3B0cigocmhzLmhhc19kYXRhKCkgJmFtcDsmYW1wOyByaHMuc2l6ZV9pbl9ieXRlcygpICZn
dDsgMCk/IG1hbGxvYyhyaHMuc2l6ZV9pbl9ieXRlcygpKSA6IG51bGxwdHIpLDxicj4mbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtePGJyPi4uL2luY2x1ZGUv
bGlicHJlc3Npb19leHQvY3BwL2RhdGEuaDoyNDc6NjY6IG5vdGU6IENhbGxpbmcgJ3ByZXNzaW9f
ZGF0YTo6c2l6ZV9pbl9ieXRlcyc8YnI+Jm5ic3A7ICZuYnNwOyBkYXRhX3B0cigocmhzLmhhc19k
YXRhKCkgJmFtcDsmYW1wOyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/IG1hbGxvYyhyaHMu
c2l6ZV9pbl9ieXRlcygpKSA6IG51bGxwdHIpLDxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO148YnI+Li4vaW5jbHVkZS9saWJwcmVz
c2lvX2V4dC9jcHAvZGF0YS5oOjM4NDoxMjogbm90ZTogQ2FsbGluZyAnZGF0YV9zaXplX2luX2J5
dGVzJmx0O3Vuc2lnbmVkIGxvbmcmZ3Q7Jzxicj4mbmJzcDsgJm5ic3A7IHJldHVybiBkYXRhX3Np
emVfaW5fYnl0ZXMoZGF0YV9kdHlwZSwgbnVtX2RpbWVuc2lvbnMoKSwgZGltcy5kYXRhKCkpOzxi
cj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO148YnI+Li4vaW5jbHVk
ZS9saWJwcmVzc2lvX2V4dC9jcHAvZGF0YS5oOjMxOjU6IG5vdGU6IFJldHVybmluZyB6ZXJvPGJy
PiZuYnNwOyAmbmJzcDsgcmV0dXJuIGRhdGFfc2l6ZV9pbl9lbGVtZW50cyhkaW1lbnNpb25zLCBk
aW1zKSAqIHByZXNzaW9fZHR5cGVfc2l6ZSh0eXBlKTs8YnI+Jm5ic3A7ICZuYnNwOyBePGJyPi4u
L2luY2x1ZGUvbGlicHJlc3Npb19leHQvY3BwL2RhdGEuaDozODQ6MTI6IG5vdGU6IFJldHVybmlu
ZyBmcm9tICdkYXRhX3NpemVfaW5fYnl0ZXMmbHQ7dW5zaWduZWQgbG9uZyZndDsnPGJyPiZuYnNw
OyAmbmJzcDsgcmV0dXJuIGRhdGFfc2l6ZV9pbl9ieXRlcyhkYXRhX2R0eXBlLCBudW1fZGltZW5z
aW9ucygpLCBkaW1zLmRhdGEoKSk7PGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgJm5ic3A7Xjxicj4uLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6Mzg0OjU6
IG5vdGU6IFJldHVybmluZyB6ZXJvPGJyPiZuYnNwOyAmbmJzcDsgcmV0dXJuIGRhdGFfc2l6ZV9p
bl9ieXRlcyhkYXRhX2R0eXBlLCBudW1fZGltZW5zaW9ucygpLCBkaW1zLmRhdGEoKSk7PGJyPiZu
YnNwOyAmbmJzcDsgXjxicj4uLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3
OjY2OiBub3RlOiBSZXR1cm5pbmcgZnJvbSAncHJlc3Npb19kYXRhOjpzaXplX2luX2J5dGVzJzxi
cj4mbmJzcDsgJm5ic3A7IGRhdGFfcHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7IHJocy5z
aXplX2luX2J5dGVzKCkgJmd0OyAwKT8gbWFsbG9jKHJocy5zaXplX2luX2J5dGVzKCkpIDogbnVs
bHB0ciksPGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7Xjxicj4uLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3
OjU5OiBub3RlOiBDYWxsIHRvICdtYWxsb2MnIGhhcyBhbiBhbGxvY2F0aW9uIHNpemUgb2YgMCBi
eXRlczxicj4mbmJzcDsgJm5ic3A7IGRhdGFfcHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7
IHJocy5zaXplX2luX2J5dGVzKCkgJmd0OyAwKT8gbWFsbG9jKHJocy5zaXplX2luX2J5dGVzKCkp
IDogbnVsbHB0ciksPGJyPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5J
cyB0aGVyZSBhIHdheSB0byBpbnN0cnVjdCB0aGUgc3RhdGljIGFuYWx5emVyIHRoYXQgbWFsbG9j
IGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBzaXplX2luX2J5dGVzID09IDAgYmVjYXVzZSBzYXlpbmcg
KHJocy5zaXplX2luX2J5dGVzKCkgJmd0OyAwKSBpc24ndCBlbm91Z2guIEknbSB1c2luZyBjbGFu
Zy05LjAuMSBvbiBnZW50b28uPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+UmVzcGVjdGZ1
bGx5LDwvZGl2PjxkaXY+Um9iZXJ0IFVuZGVyd29vZDxicj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>