fuzzReadLinear.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright 2021 Axel Waggershauser
  3. */
  4. // SPDX-License-Identifier: Apache-2.0
  5. #include <stdint.h>
  6. #include <stddef.h>
  7. #include "oned/ODMultiUPCEANReader.h"
  8. #include "oned/ODCode39Reader.h"
  9. #include "oned/ODCode93Reader.h"
  10. #include "oned/ODCode128Reader.h"
  11. #include "oned/ODDataBarReader.h"
  12. #include "oned/ODDataBarExpandedReader.h"
  13. #include "oned/ODDXFilmEdgeReader.h"
  14. #include "oned/ODITFReader.h"
  15. #include "oned/ODCodabarReader.h"
  16. #include "ReaderOptions.h"
  17. #include "Barcode.h"
  18. using namespace ZXing;
  19. using namespace ZXing::OneD;
  20. static std::vector<std::unique_ptr<RowReader>> readers;
  21. bool init()
  22. {
  23. static ReaderOptions opts;
  24. opts.setReturnErrors(true);
  25. readers.emplace_back(new MultiUPCEANReader(opts));
  26. readers.emplace_back(new Code39Reader(opts));
  27. readers.emplace_back(new Code93Reader(opts));
  28. readers.emplace_back(new Code128Reader(opts));
  29. readers.emplace_back(new ITFReader(opts));
  30. readers.emplace_back(new CodabarReader(opts));
  31. readers.emplace_back(new DataBarReader(opts));
  32. readers.emplace_back(new DataBarExpandedReader(opts));
  33. readers.emplace_back(new DXFilmEdgeReader(opts));
  34. return true;
  35. }
  36. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
  37. {
  38. if (size < 1)
  39. return 0;
  40. static bool inited [[maybe_unused]] = init();
  41. std::vector<std::unique_ptr<RowReader::DecodingState>> decodingState(readers.size());
  42. PatternRow row(size * 2 + 1);
  43. for (size_t i = 0; i < size; ++i){
  44. auto v = data[i];
  45. row[i * 2 + 0] = (v & 0xf) + 1;
  46. row[i * 2 + 1] = (v >> 4) + 1;
  47. }
  48. row.back() = 0;
  49. for (size_t r = 0; r < readers.size(); ++r) {
  50. PatternView next(row);
  51. while (next.isValid()) {
  52. readers[r]->decodePattern(0, next, decodingState[r]);
  53. // make sure we make progress and we start the next try on a bar
  54. next.shift(2 - (next.index() % 2));
  55. next.extend();
  56. }
  57. }
  58. return 0;
  59. }