From 7490cba21c5a108c7b60b43387c308df86ed97a5 Mon Sep 17 00:00:00 2001 From: Ahmed Shehab Date: Tue, 9 Jul 2024 11:53:36 +0300 Subject: [PATCH] Added testcase that tests %a & %A format specifiers in vfscanf issue found by running SuperTest by Solid Sands Signed-off-by: Ahmed Shehab --- test/meson.build | 1 + test/test-vfscanf-percent-a.c | 104 ++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 test/test-vfscanf-percent-a.c diff --git a/test/meson.build b/test/meson.build index 72ee048fbc..2ae3f6757c 100644 --- a/test/meson.build +++ b/test/meson.build @@ -544,6 +544,7 @@ foreach target : targets 'test-ungetc-ftell', 'test-fgetc', 'test-fgets-eof', + 'test-vfscanf-percentaA', ] endif endif diff --git a/test/test-vfscanf-percent-a.c b/test/test-vfscanf-percent-a.c new file mode 100644 index 0000000000..ea6e7180ca --- /dev/null +++ b/test/test-vfscanf-percent-a.c @@ -0,0 +1,104 @@ +/* +* SPDX-License-Identifier: BSD-3-Clause +* +* Copyright © 2024, Synopsys Inc. +* Copyright © 2024, Solid Sands B.V. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* +* 3. Neither the name of the copyright holder nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +* OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#ifndef TEST_FILE_NAME +#define TEST_FILE_NAME "VFSCANFPERCENTaA.TXT" +#endif + +const char* input_string = "0x1.1p+3 0x1.6p+2 "; + +int compare_floats(float a, float b, float tolerance) { + return fabs(a - b) < tolerance; +} + +int main() { + int res = -1; + int ret = 0; + float var = 0.0F; + float tolerance = 1e-6; + const float ref_out = 5.5F; + + FILE *file = NULL; + + file = fopen(TEST_FILE_NAME, "w"); + if( file == NULL ) + return 0; + + res = fprintf(file, "%s", input_string); + + fclose(file); + + { + file = fopen(TEST_FILE_NAME, "r"); + if( file == NULL ) + return 0; + + res = fscanf(file, "%a %a ", &var, &var); + ret = compare_floats(var, ref_out, tolerance); + + if ((res != 2) || (ret == 0)) { + printf("Test Case 1 Failed: Failed to read the input string correctly using %%a\n"); + } + else { + printf("Test Case 1 Passed: %%a is handled correctly\n"); + } + + fclose(file); + } + + { + file = fopen(TEST_FILE_NAME, "r" ); + if( file == NULL ) + return 0; + + res = fscanf( file, "%A %A ", &var, &var); + ret = compare_floats(var, ref_out, tolerance); + + if ((res != 2) || (ret == 0)) { + printf("Test Case 2 Failed: Failed to read the input string correctly using %%A\n"); + } + else { + printf("Test Case 2 Passed: %%A is handled correctly\n"); + } + + fclose(file); + } + + return 0; +} \ No newline at end of file