+ if (!(po->flags & OPF_TAIL)
+ && !(g_sct_func_attr & SCTFA_NOWARN))
+ {
+ // treat al write as overwrite to avoid many false positives
+ if (IS(pp->ret_type.name, "void") || pp->ret_type.is_float) {
+ find_next_read_reg(i + 1, opcnt, xAX, OPLM_BYTE,
+ i + opcnt * 25, &j);
+ if (j != -1) {
+ fnote(po, "eax used after void/float ret call\n");
+ fnote(&ops[j], "(used here)\n");
+ }
+ }
+ if (!strstr(pp->ret_type.name, "int64")) {
+ find_next_read_reg(i + 1, opcnt, xDX, OPLM_BYTE,
+ i + opcnt * 26, &j);
+ // indirect calls are often guessed, don't warn
+ if (j != -1 && !IS_OP_INDIRECT_CALL(&ops[j])) {
+ fnote(po, "edx used after 32bit ret call\n");
+ fnote(&ops[j], "(used here)\n");
+ }
+ }
+ j = 1;
+ // msvc often relies on callee not modifying 'this'
+ for (arg = 0; arg < pp->argc; arg++) {
+ if (pp->arg[arg].reg && IS(pp->arg[arg].reg, "ecx")) {
+ j = 0;
+ break;
+ }
+ }
+ if (j != 0) {
+ find_next_read_reg(i + 1, opcnt, xCX, OPLM_BYTE,
+ i + opcnt * 27, &j);
+ if (j != -1 && !IS_OP_INDIRECT_CALL(&ops[j])) {
+ fnote(po, "ecx used after call\n");
+ fnote(&ops[j], "(used here)\n");
+ }
+ }
+ }