diff mbox series

[FFmpeg-devel] fate/integer.c: Connect test to fuzzer

Message ID 20210503103428.839392-1-vedaa@riseup.net
State New
Headers show
Series [FFmpeg-devel] fate/integer.c: Connect test to fuzzer
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate fail Make fate failed
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate warning Make fate failed

Commit Message

Vedaa May 3, 2021, 10:34 a.m. UTC
Hi,

I am applying for GSoC '21. I have attempted to connect fate-integer to the
 fuzzer by using a header file with the test function to ensure code
 reusability. However, the linker is unable to link the function definiton.
 What changes should I make to properly link the function?

---
 Makefile                  |  2 ++
 libavutil/tests/integer.c | 36 ++++++++++++++++++------------------
 libavutil/tests/integer.h | 26 ++++++++++++++++++++++++++
 tools/Makefile            |  3 +++
 tools/target_int_fuzzer.c | 32 ++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 18 deletions(-)
 create mode 100644 libavutil/tests/integer.h
 create mode 100644 tools/target_int_fuzzer.c

Comments

Michael Niedermayer May 3, 2021, 1:28 p.m. UTC | #1
On Mon, May 03, 2021 at 04:04:28PM +0530, Vedaa wrote:
> Hi,
> 
> I am applying for GSoC '21. I have attempted to connect fate-integer to the
>  fuzzer by using a header file with the test function to ensure code
>  reusability. However, the linker is unable to link the function definiton.
>  What changes should I make to properly link the function?

The fate tests are seperate excutables and not part of the libraraies
so linking to the libraraies will not include the code from the fate 
tests
you can either move the code itself to a static inline function in a header
and include that by both the fate test and the fuzzer. Or you can change the
excutabel of the test so it takes the parameters via the command line and
then execute the excutable with fuzzed parameters
There are other possibilities too, these are just the 2 most obvious

more comments below

[...]
> +++ b/Makefile
> @@ -62,6 +62,8 @@ tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS)
>  tools/target_io_dem_fuzzer$(EXESUF): tools/target_io_dem_fuzzer.o $(FF_DEP_LIBS)
>  	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
>  
> +target_int_fuzzer$(EXESUF): tools/target_int_fuzzer.o $(FF_DEP_LIBS)

tools/target_int_fuzzer$ ...


[...]
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include <libavutil/tests/integer.h>
> +
> +int LLVMFuzzerTestOneInput( const uint8_t *data, size_t size ) {

missing prototype, see the othert fuzzers


> +    if (size < 2 * sizeof(int64_t))
> +        return 1;
> +
> +    int64_t a,b;

> +    memcpy(&a,data,sizeof(int64_t));
> +    memcpy(&b,&(data[sizeof(int64_t)]),sizeof(int64_t));

AV_RB64() otherwise fuzzer samples would behave different on big endian

thx

[...]
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 7e9d8b08c3..416fc9b3e0 100644
--- a/Makefile
+++ b/Makefile
@@ -62,6 +62,8 @@  tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS)
 tools/target_io_dem_fuzzer$(EXESUF): tools/target_io_dem_fuzzer.o $(FF_DEP_LIBS)
 	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
 
+target_int_fuzzer$(EXESUF): tools/target_int_fuzzer.o $(FF_DEP_LIBS)
+	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
 
 tools/enum_options$(EXESUF): ELIBS = $(FF_EXTRALIBS)
 tools/enum_options$(EXESUF): $(FF_DEP_LIBS)
diff --git a/libavutil/tests/integer.c b/libavutil/tests/integer.c
index d2c8f2a903..644518485c 100644
--- a/libavutil/tests/integer.c
+++ b/libavutil/tests/integer.c
@@ -18,31 +18,31 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include <stdint.h>
+#include "libavutil/tests/integer.h"
 
-#include "libavutil/avassert.h"
-#include "libavutil/integer.h"
-#include "libavutil/intmath.h"
+void TestInteger(int64_t a, int64_t b) {
+    AVInteger ai= av_int2i(a);
+    AVInteger bi= av_int2i(b);
+
+    av_assert0(av_i2int(ai) == a);
+    av_assert0(av_i2int(bi) == b);
+    av_assert0(av_i2int(av_add_i(ai,bi)) == a+b);
+    av_assert0(av_i2int(av_sub_i(ai,bi)) == a-b);
+    av_assert0(av_i2int(av_mul_i(ai,bi)) == a*b);
+    av_assert0(av_i2int(av_shr_i(ai, 9)) == a>>9);
+    av_assert0(av_i2int(av_shr_i(ai,-9)) == a<<9);
+    av_assert0(av_i2int(av_shr_i(ai, 17)) == a>>17);
+    av_assert0(av_i2int(av_shr_i(ai,-17)) == a<<17);
+    av_assert0(av_log2_i(ai) == av_log2(a));
+    av_assert0(av_i2int(av_div_i(ai,bi)) == a/b);
+}
 
 int main(void){
     int64_t a,b;
 
     for(a=7; a<256*256*256; a+=13215){
         for(b=3; b<256*256*256; b+=27118){
-            AVInteger ai= av_int2i(a);
-            AVInteger bi= av_int2i(b);
-
-            av_assert0(av_i2int(ai) == a);
-            av_assert0(av_i2int(bi) == b);
-            av_assert0(av_i2int(av_add_i(ai,bi)) == a+b);
-            av_assert0(av_i2int(av_sub_i(ai,bi)) == a-b);
-            av_assert0(av_i2int(av_mul_i(ai,bi)) == a*b);
-            av_assert0(av_i2int(av_shr_i(ai, 9)) == a>>9);
-            av_assert0(av_i2int(av_shr_i(ai,-9)) == a<<9);
-            av_assert0(av_i2int(av_shr_i(ai, 17)) == a>>17);
-            av_assert0(av_i2int(av_shr_i(ai,-17)) == a<<17);
-            av_assert0(av_log2_i(ai) == av_log2(a));
-            av_assert0(av_i2int(av_div_i(ai,bi)) == a/b);
+            TestInteger(a,b);
         }
     }
     return 0;
diff --git a/libavutil/tests/integer.h b/libavutil/tests/integer.h
new file mode 100644
index 0000000000..97f15862a3
--- /dev/null
+++ b/libavutil/tests/integer.h
@@ -0,0 +1,26 @@ 
+/*
+ * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdint.h>
+#include "libavutil/avassert.h"
+#include "libavutil/integer.h"
+#include "libavutil/intmath.h"
+
+void TestInteger(int64_t a, int64_t b);
diff --git a/tools/Makefile b/tools/Makefile
index 82baa8eadb..fde7f08984 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -17,6 +17,9 @@  tools/target_dem_fuzzer.o: tools/target_dem_fuzzer.c
 tools/target_io_dem_fuzzer.o: tools/target_dem_fuzzer.c
 	$(COMPILE_C) -DIO_FLAT=0
 
+tools/target_int_fuzzer.o: tools/target_int_fuzzer.c
+	$(COMPILE_C)
+
 OUTDIRS += tools
 
 clean::
diff --git a/tools/target_int_fuzzer.c b/tools/target_int_fuzzer.c
new file mode 100644
index 0000000000..f6edabe06b
--- /dev/null
+++ b/tools/target_int_fuzzer.c
@@ -0,0 +1,32 @@ 
+/*
+ * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <libavutil/tests/integer.h>
+
+int LLVMFuzzerTestOneInput( const uint8_t *data, size_t size ) {
+    if (size < 2 * sizeof(int64_t))
+        return 1;
+
+    int64_t a,b;
+    memcpy(&a,data,sizeof(int64_t));
+    memcpy(&b,&(data[sizeof(int64_t)]),sizeof(int64_t));
+    TestInteger(a,b);
+    return 0;
+}