Hi Andrii,
On Tue, Jun 3, 2025 at 11:39 AM Andrii Nakryiko andrii.nakryiko@gmail.com wrote:
Good question. That E2BIG error would happen, for example, if we tried to print the array "{ 'a', 'b', 'c' }" when the type was "char[4]".
Exactly, data is truncated, we have to return E2BIG. But I think that is checked earlier with btf_dump_type_data_check_overflow(), so we probably don't need to do this here?
btf_dump_type_data_check_overflow() only looks at INT, FLOAT, PTR, ENUM, and ENUM64 types: https://elixir.bootlin.com/linux/v6.15/source/tools/lib/bpf/btf_dump.c#L2304...
So we still need to do this manually for this ARRAY type.
Please add tests with truncated data so we know for sure?
I've added tests; see below.
I'd say your proposed behavior would be consistent with the semantic of ".emit_strings should display strings in an intuitively useful way",
It still should follow the overall contract, so I think E2BIG is justified for truncated data.
But there is also a bit of a quirk. If a string is not zero-terminated, we actually don't distinguish it in any way. Would it make sense to detect this and still print it as an array of individual characters? It's clearly not a valid C string at that point, so emit_strings doesn't have to apply. WDYT? The implementation would be simple -- find zero in an array, if found - emit everything up to that point as string, if not - emit character array?
I don't have strong feelings one way or another, so I've just implemented this. btf_dump_array_data() now keeps going and does its current behavior if btf_dump_string_data() hit an error. In practice, btf_dump_array_data() does *not* return E2BIG if the provided array is too big for the type; it just displays the first N elements of the array and then returns. I don't plan to change this behavior.
Updated patches coming shortly.
Blake