x = 2
, you can search the graph for CALL nodes with the assignment operator as their method, e.g. cpg.call.methodFullName(Operators.assignment).l
. If you're looking for byte-copying stdlib functions with a specific variable as argument, you would search for cpg.call.code(".*strcpy.*").where(_.argument.codeExact("x"))
. Other steps from the reference card might be helpful https://docs.joern.io/cpgql/reference-card
=(res,crypto_scalarmult((unsigned char *)q, (unsigned char *)n, (unsigned char *)p)
.
.filter(node => node.property("NAME") != null && (Array("<operator>.preIncrement", "<operator>.postIncrement", "<operator>.preDecrement", "<operator>.postDecrement").toList.contains(node.property("NAME").toString) || node.property("NAME").toString.slice(0, 21).equals("<operator>.assignment")))
joern> cpg.method.name("<operator>.*").callIn.head
res12: Call = Call(
id -> 1000882L,
code -> "--pos",
name -> "<operator>.preDecrement",
order -> 3,
methodInstFullName -> None,
methodFullName -> "<operator>.preDecrement",
argumentIndex -> 3,
dispatchType -> "STATIC_DISPATCH",
signature -> "TODO assignment signature",
typeFullName -> "ANY",
dynamicTypeHintFullName -> List(),
lineNumber -> Some(value = 189),
columnNumber -> Some(value = 26),
resolved -> None,
depthFirstOrder -> None,
internalFlags -> None
)
joern> val myOperators = List("<operator>.preDecrement", "<operator>.assignment")
myOperators: List[String] = List("<operator>.preDecrement", "<operator>.assignment")
joern> cpg.method.name(myOperators:_*).name.p
res18: List[String] = List("<operator>.preDecrement", "<operator>.assignment")
myOperators:_*
hi! I'm a starter of Joern, and I have difficulty connecting Joern server mode. (./joern --server).
I want to connect my VM server(Ubuntu) with my local pc(MacOs).
(I turn on the joern server in my vm server and try to access the server through python in local PC,MacOS)
But, when I ran my python program, the program failed due to a connection error.
Here are some of the details:
[ip info]
vmware ubuntu(NAT): 172.16.191.2
[error message]
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/selector_events.py", line 526, in _sock_connect_cb
raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 61] Connect call failed ('172.16.191.2', 8080)
[in my python program code]server_endpoint = "172.16.191.2:8080" //following github(cpgqls-client) example
[More info]
1) I checked vm netstat when I turned on Joern server, and I saw that port 8080 port is open.
2) I checked connection between vm and local PC, and it’s ok(checking through ping)
3) I checked tcpdump in local PC, when local PC access to VM Joern server Port, it returns RST packet, so the connection failed.
So… is there a solution about this issue?
val cfgChildren = method.out(EdgeTypes.CFG).asScala.collect { case node: nodes.CfgNode => node }.toList
// val local = new NodeSteps(
val local = new Traversal(
//methodVertex
method
.out(EdgeTypes.CONTAINS)
.hasLabel(NodeTypes.BLOCK)
.out(EdgeTypes.AST)
.hasLabel(NodeTypes.LOCAL)
.cast[nodes.Local])
val sink = local.evalType(".*").referencingIdentifiers.dedup
//val source = new NodeSteps(methodVertex.out(EdgeTypes.CONTAINS).hasLabel(NodeTypes.CALL).cast[nodes.Call]).nameNot("<operator>.*").dedup
val source = new Traversal(method.out(EdgeTypes.CONTAINS).hasLabel(NodeTypes.CALL).cast[nodes.Call]).nameNot("<operator>.*").dedup
val pdgChildren = sink
.reachableByFlows(source)
.l
.flatMap { path =>
path.elements
.map {
case trackingPoint @ (_: MethodParameterIn) => trackingPoint.start.method.head
case trackingPoint => trackingPoint.cfgNode
}
}
.filter(_.toString != methodId)
GraphForFuncsFunction(methodName, methodFile, methodId, astChildren, cfgChildren, pdgChildren.distinct)
int
main(int argc, char *argv[]) {
int eaten = atoi(argv[1]);
int value ;
if (!strcmp(argv[1]), "drink") {
eaten += 1;
value = eaten * 3;
} else {
value = eaten;
}
return value;
}
void array_oob()
{
int user = read_byte();
global_array[user] = 1;
}
def F() = {
val src = cpg.call.name("read_byte")
val sink = cpg.call.name("<operator>.indirectIndexAccess").argument.order(2)
sink.reachableByFlows(src)
}
F.l
hello, new to Joern community. i'm wondering if joern can read .bc file to generate cpg
Hi @fangshengqun_gitlab, i guess you are looking for https://docs.joern.io/llvm2cpg/getting-bitcode :)