introduce flake8-print linter

This commit is contained in:
Willi Ballenthin
2023-07-09 22:44:47 +02:00
parent 106b12e2a4
commit 4a49543d12
13 changed files with 19 additions and 185 deletions

13
.github/flake8.ini vendored
View File

@@ -14,3 +14,16 @@ extend-ignore =
B010, B010,
# G200 Logging statement uses exception in arguments # G200 Logging statement uses exception in arguments
G200 G200
per-file-ignores =
# T201 print found.
#
# scripts are meant to print output
scripts/*: T201
# capa.exe is meant to print output
capa/main.py: T201
# IDA tests emit results to output window so need to print
tests/test_ida_features.py: T201
# utility used to find the Binary Ninja API via invoking python.exe
capa/features/extractors/binja/find_binja_api.py: T201

View File

@@ -6,7 +6,6 @@
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License. # See the License for the specific language governing permissions and limitations under the License.
import sys
import string import string
import struct import struct
from typing import Tuple, Iterator from typing import Tuple, Iterator
@@ -182,30 +181,3 @@ BASIC_BLOCK_HANDLERS = (
extract_bb_tight_loop, extract_bb_tight_loop,
extract_bb_stackstring, extract_bb_stackstring,
) )
def main():
if len(sys.argv) < 2:
return
from binaryninja import BinaryViewType
from capa.features.extractors.binja.extractor import BinjaFeatureExtractor
bv: BinaryView = BinaryViewType.get_view_of_file(sys.argv[1])
if bv is None:
return
features = []
extractor = BinjaFeatureExtractor(bv)
for fh in extractor.get_functions():
for bbh in extractor.get_basic_blocks(fh):
features.extend(list(extract_features(fh, bbh)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -6,7 +6,6 @@
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License. # See the License for the specific language governing permissions and limitations under the License.
import sys
import struct import struct
from typing import Tuple, Iterator from typing import Tuple, Iterator
@@ -166,23 +165,3 @@ FILE_HANDLERS = (
extract_file_function_names, extract_file_function_names,
extract_file_format, extract_file_format,
) )
def main():
""" """
if len(sys.argv) < 2:
return
from binaryninja import BinaryViewType
bv: BinaryView = BinaryViewType.get_view_of_file(sys.argv[1])
if bv is None:
return
import pprint
pprint.pprint(list(extract_features(bv)))
if __name__ == "__main__":
main()

View File

@@ -5,7 +5,6 @@
# Unless required by applicable law or agreed to in writing, software distributed under the License # Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License. # See the License for the specific language governing permissions and limitations under the License.
import sys
from typing import Tuple, Iterator from typing import Tuple, Iterator
from binaryninja import Function, BinaryView, LowLevelILOperation from binaryninja import Function, BinaryView, LowLevelILOperation
@@ -67,30 +66,3 @@ def extract_features(fh: FunctionHandle) -> Iterator[Tuple[Feature, Address]]:
FUNCTION_HANDLERS = (extract_function_calls_to, extract_function_loop, extract_recursive_call) FUNCTION_HANDLERS = (extract_function_calls_to, extract_function_loop, extract_recursive_call)
def main():
""" """
if len(sys.argv) < 2:
return
from binaryninja import BinaryViewType
from capa.features.extractors.binja.extractor import BinjaFeatureExtractor
bv: BinaryView = BinaryViewType.get_view_of_file(sys.argv[1])
if bv is None:
return
features = []
extractor = BinjaFeatureExtractor(bv)
for fh in extractor.get_functions():
features.extend(list(extract_features(fh)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -5,7 +5,6 @@
# Unless required by applicable law or agreed to in writing, software distributed under the License # Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License. # See the License for the specific language governing permissions and limitations under the License.
import sys
from typing import Any, List, Tuple, Iterator, Optional from typing import Any, List, Tuple, Iterator, Optional
from binaryninja import Function from binaryninja import Function
@@ -585,32 +584,3 @@ INSTRUCTION_HANDLERS = (
extract_function_calls_from, extract_function_calls_from,
extract_function_indirect_call_characteristic_features, extract_function_indirect_call_characteristic_features,
) )
def main():
""" """
if len(sys.argv) < 2:
return
from binaryninja import BinaryViewType
from capa.features.extractors.binja.extractor import BinjaFeatureExtractor
bv: BinaryView = BinaryViewType.get_view_of_file(sys.argv[1])
if bv is None:
return
features = []
extractor = BinjaFeatureExtractor(bv)
for fh in extractor.get_functions():
for bbh in extractor.get_basic_blocks(fh):
for insn in extractor.get_instructions(fh, bbh):
features.extend(list(extract_features(fh, bbh, insn)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -104,19 +104,3 @@ BASIC_BLOCK_HANDLERS = (
extract_bb_tight_loop, extract_bb_tight_loop,
extract_bb_stackstring, extract_bb_stackstring,
) )
def main():
features = []
for fhandle in helpers.get_functions(skip_thunks=True, skip_libs=True):
f: idaapi.func_t = fhandle.inner
for bb in idaapi.FlowChart(f, flags=idaapi.FC_PREDS):
features.extend(list(extract_features(fhandle, bb)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -199,14 +199,3 @@ FILE_HANDLERS = (
extract_file_function_names, extract_file_function_names,
extract_file_format, extract_file_format,
) )
def main():
""" """
import pprint
pprint.pprint(list(extract_features()))
if __name__ == "__main__":
main()

View File

@@ -50,18 +50,3 @@ def extract_features(fh: FunctionHandle) -> Iterator[Tuple[Feature, Address]]:
FUNCTION_HANDLERS = (extract_function_calls_to, extract_function_loop, extract_recursive_call) FUNCTION_HANDLERS = (extract_function_calls_to, extract_function_loop, extract_recursive_call)
def main():
""" """
features = []
for fhandle in capa.features.extractors.ida.helpers.get_functions(skip_thunks=True, skip_libs=True):
features.extend(list(extract_features(fhandle)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -501,20 +501,3 @@ INSTRUCTION_HANDLERS = (
extract_function_calls_from, extract_function_calls_from,
extract_function_indirect_call_characteristic_features, extract_function_indirect_call_characteristic_features,
) )
def main():
""" """
features = []
for f in capa.features.extractors.ida.helpers.get_functions(skip_thunks=True, skip_libs=True):
for bb in idaapi.FlowChart(f, flags=idaapi.FC_PREDS):
for insn in capa.features.extractors.ida.helpers.get_instructions_in_range(bb.start_ea, bb.end_ea):
features.extend(list(extract_features(f, bb, insn)))
import pprint
pprint.pprint(features)
if __name__ == "__main__":
main()

View File

@@ -85,20 +85,3 @@ def extract_unicode_strings(buf, n=4):
yield String(match.group().decode("utf-16"), match.start()) yield String(match.group().decode("utf-16"), match.start())
except UnicodeDecodeError: except UnicodeDecodeError:
pass pass
def main():
import sys
with open(sys.argv[1], "rb") as f:
b = f.read()
for s in extract_ascii_strings(b):
print("0x{:x}: {:s}".format(s.offset, s.s))
for s in extract_unicode_strings(b):
print("0x{:x}: {:s}".format(s.offset, s.s))
if __name__ == "__main__":
main()

View File

@@ -96,7 +96,7 @@ def redirecting_print_to_tqdm(disable_progress):
with one that is compatible with tqdm. with one that is compatible with tqdm.
via: https://stackoverflow.com/a/42424890/87207 via: https://stackoverflow.com/a/42424890/87207
""" """
old_print = print old_print = print # noqa: T202 [reserved word print used]
def new_print(*args, **kwargs): def new_print(*args, **kwargs):
# If tqdm.tqdm.write raises error, use builtin print # If tqdm.tqdm.write raises error, use builtin print

View File

@@ -80,6 +80,7 @@ setuptools.setup(
"flake8-comprehensions==3.13.0", "flake8-comprehensions==3.13.0",
"flake8-logging-format==0.9.0", "flake8-logging-format==0.9.0",
"flake8-no-implicit-concat==0.3.4", "flake8-no-implicit-concat==0.3.4",
"flake8-print==5.0.0",
"ruff==0.0.275", "ruff==0.0.275",
"black==23.3.0", "black==23.3.0",
"isort==5.11.4", "isort==5.11.4",

View File

@@ -8,11 +8,14 @@
import os import os
import sys import sys
import logging
import textwrap import textwrap
import subprocess import subprocess
import pytest import pytest
logger = logging.getLogger(__name__)
CD = os.path.dirname(__file__) CD = os.path.dirname(__file__)
@@ -63,7 +66,7 @@ def test_bulk_process(tmpdir):
def run_program(script_path, args): def run_program(script_path, args):
args = [sys.executable] + [script_path] + args args = [sys.executable] + [script_path] + args
print(f"running: '{args}'") logger.debug("running: %r", args)
return subprocess.run(args, stdout=subprocess.PIPE) return subprocess.run(args, stdout=subprocess.PIPE)